奇怪的ClassNotFoundException

时间:2016-05-13 22:45:24

标签: java exception jar executable-jar

当我在eclipse中调试时,这行代码工作正常。

this.primaryStage.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
                    @Override
                    public void handle(KeyEvent keyEvent) { 
                            InputManager.Instance().addEvent(keyEvent); 
                        }
                });

当我将自己的代码(不是脚本)导出到.jar中时,它会抛出一个相当长的异常。

Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unk
nown Source)
        at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Sou
rce)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown So
urce)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$156(
Unknown Source)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: test/Game$1
        at test.Game.start(Game.java:62)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163
(Unknown Source)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(Unknown
 Source)
        at com.sun.javafx.application.PlatformImpl.lambda$null$174(Unknown Sourc
e)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(Unknown S
ource)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$149(Unknown Source)
        ... 1 more
Caused by: java.lang.ClassNotFoundException: test.Game$1
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 10 more
Exception running application test.Game

然而,当我以相同的方式导出它时,但是处理程序被注释掉了,它运行正常。 我试过root.addEventHandler,root / primaryStage.setOnKeyPressed,单独声明处理程序,..

你能发现原因吗?

2 个答案:

答案 0 :(得分:1)

  

使用我自己的代码将其导出到.jar

您自己的代码&#34;是不是正确的,因为它不包括(define low (λ (a) (cond [(zero? a) '()] [else (cons (sub1 a) (low (sub1 a)))]))) 文件中的SqlConnection con = new SqlConnection("connection string here"); ... con.Open(); SqlCommand cmd = new SqlCommand(@"INSERT INTO Accounts (server) VALUES ('" + comboBox1.SelectedItem.ToString() + "'", con); cmd.ExecuteNonQuery(); con.Close(); MessageBox.Show("Data inserted."); 文件。

您的课程在test/Game$1.class包中被称为.jar。当类使用匿名类时,必须为这些类指定名称,以便创建Game文件(内部也需要名称)。这些文件的名称可以是任何名称,但当前方案是在定义类之后命名,在test符号后添加序列号,因此第一个匿名类被调用{ {1}},第二个将被称为.class,依此类推。

这就是为什么在编译$时,最终会得到2个文件:Game$1.classGame$2.class这些文件的两个都必须添加到Game.java文件中。

如果可能的话,你不应该依赖这个命名约定,因为它可能在将来发生变化,而其他编译器可能会采用不同的方式。

答案 1 :(得分:0)

ClassNotFound异常通常是由于您的CLASSPATH环境变量未正确设置。

JVM必须从CLASSPATH目录遍历各处,但无法找到已编译的* .class和java jar文件。解决此问题的一种方法是使用java二进制文件中的-cp选项。或者,您可以将CLASSPATH环境设置为java文件所在的目录。

在Ecplipse中运行正常,因为classPath设置为工作区,IDE已经为您处理了这个问题。

  

请阅读此处了解有关CLASSPATH的更多信息。   https://docs.oracle.com/javase/tutorial/essential/environment/paths.html