程序编译很好但崩溃与NoClassDefFoundError

时间:2011-02-13 04:56:51

标签: java bluej

我写了五个课程,简而言之,就是为了创建一个GUI并为会议录制参与者。我已经构建了面板并添加了它们,FocusListeners,ActionListeners,ItemListeners。

从我可以收集的内容来看,我遇到崩溃的消息与我的Classpath有关,但我真的不知道如何修复它。这是发生崩溃的代码(当我为面板的两个按钮添加ActionListeners时:

private void buildButtonPanel()
{
   //create the buttonpanel
   buttonPanel = new JPanel(new FlowLayout());
   //create the buttons
   calculate = new JButton("Calculate Charges");
   clear = new JButton    ("Clear");
   //add listeners to the buttons
   ConferenceHandler handler = new ConferenceHandler(this);
   calculate.addActionListener(handler);             //crash occurs on this line
   clear.addActionListener(handler);
   //create a text area
   JTextArea textArea = new JTextArea(5,30); 
   textArea.setLineWrap(true); textArea.setWrapStyleWord(true);
   //add a scrollbar to the textarea
   JScrollPane scroll = new JScrollPane (textArea);
   //add everything to the buttonpanel
   buttonPanel.add(calculate); buttonPanel.add(clear); buttonPanel.add(scroll);
}

我得到的崩溃消息:

java.lang.NoClassDefFoundError: ConferenceHandler
    at ConferenceGUI.buildButtonPanel(ConferenceGUI.java:63)
    at ConferenceGUI.<init>(ConferenceGUI.java:33)
    at IsItWorking.<init>(IsItWorking.java:16)
    at IsItWorking.main(IsItWorking.java:28)
Caused by: java.lang.ClassNotFoundException: ConferenceHandler
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at ConferenceGUI.buildButtonPanel(ConferenceGUI.java:63)
    at ConferenceGUI.<init>(ConferenceGUI.java:33)
    at IsItWorking.<init>(IsItWorking.java:16)
    at IsItWorking.main(IsItWorking.java:28)
    at __SHELL0.run(__SHELL0.java:6)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at bluej.runtime.ExecServer$3.run(ExecServer.java:774)

我知道这里有很多人有很多经验,我在这个网站上找不到任何帮助。

1 个答案:

答案 0 :(得分:2)

  

至于告诉java在哪里可以找到ConferenceHandler(我为听起来很愚蠢而道歉 - 新手请问作业问题)我正在使用Blue Jay,我所要做的就是点击main,程序运行。我不知道如何从命令行执行此操作。

要查看的地方是java命令的文档;例如here。特别注意讨论类路径的东西以及设置它的不同方法。另请阅读this page


  

我意识到这是classpath的一个问题,无论我做了什么,我都无法修复它。所以我把所有的原始课程都粘贴到一个新的文件夹中,它就像一个魅力。

这是一个Voodoo解决方案。你真的需要了解这个问题。

为此,我们重新审视上面的一些评论:

  

stacktrace另有说明。它们是无包装的(换句话说,在默认包中,如果BlueJ以某种方式告诉你)。 - @BalusC

     

我希望我知道这意味着什么...... - @unit

@BalusC的含义是堆栈跟踪告诉您它尝试加载的类的全名。

    ...
    Caused by: java.lang.ClassNotFoundException: ConferenceHandler
    ...

全名(在本例中)是ConsoleHandler ...而不是some.pkg.ConsoleHandler

为什么会发生这种情况并不完全清楚,但我怀疑您实际上在运行与您正在查看的源代码不匹配的旧.class文件。而你的Voodoo解决方案可以通过用新东西替换旧的.class文件来“修复”这个问题。但如果是这种情况,您需要了解构建/部署方式的问题。否则,你会一遍又一遍地绊倒这种东西。