2

我的本地目录中有一个 .class 文件,由以下 jasmin 代码组装而成:

.class public default_class
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit locals 10
.limit stack 10
invokestatic main_65428301()I
return
.end method
.method public static main_65428301()I
.limit locals 10
.limit stack 10
ldc "foobar"
astore_0
iconst_0
ireturn
.end method

当我执行 java -jar jasmin.jar test.j 时,所有内容都会编译并获得 .class 文件,但我无法使用 java default_class 启动它,因为我收到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: 
    at default_class.main(test.j)
Caused by: java.lang.ClassNotFoundException: 
    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:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 1 more

我的 JAVA_HOME 是:

/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

并且类路径仅包含我当前的目录(此 .class 文件所在的位置)。我应该添加一些东西吗?

编辑:我用来启动我的课程的命令是java default_class

EDIT2:好的,我终于弄清楚出了什么问题!类名必须以大写开头!这解决了我的问题!无论如何,感谢所有试图帮助我的人!

4

2 回答 2

2

你通常会想要:

java -cp . NameOfClassWithMainMethod

运行位于当前目录中的单个类文件。但是,如果您仔细阅读堆栈跟踪,您会发现 Java 找到了您的主类和主方法,但找不到其他东西。从您发布的代码中,我看不出是什么。

跑步

java -verbose:class ......

可能会阐明这种情况,就像使用调试器来观察工作和游戏中的类加载器一样。就像使用 strace 查看它试图打开的文件一样。

于 2013-01-06T12:38:07.820 回答
0

您的错误消息说:

java.lang.ClassNotFoundException:

但此消息的格式通常如下所示:

java.lang.ClassNotFoundException: SomeNonExistingClass

找不到的类名怎么不见了?因为您的示例中有一条指令引用了一个空的类名(“”)。因此,您需要查找忘记指定类名的指令。就在这里:

invokestatic main_65428301()I

相反,它应该是:

invokestatic default_class/main_65428301()I

这将解决您的问题。

怀疑你写:

EDIT2:好的,我终于弄清楚出了什么问题!类名必须以大写开头!这解决了我的问题!无论如何,感谢所有试图帮助我的人!

因为没有任何迹象表明这可能是一个原因,实际上也不是这样。

于 2014-06-10T21:36:18.323 回答