我在本地目录中有一个.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 jasmine .jar测试时。. 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
My JAVA_HOME is:
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
和classpath只包含我的当前目录(这个.class文件所在的目录)。我该加点什么吗?
编辑:我用来启动类的命令是java default_class
EDIT2:好了,我终于知道是哪里出了问题了!类名必须以大写字母开头!这解决了我的问题!无论如何,感谢所有试图帮助我的人!
您通常需要:
java -cp . NameOfClassWithMainMethod
运行当前目录中的单个类文件。然而,如果仔细阅读堆栈跟踪,就会发现Java找到了主类和主方法,但找不到其他东西。从你发布的代码来看,我看不出什么。
运行java -verbose:class ......
可以说明这种情况,就像使用as调试器来观察类装入器的工作和运行一样。
你的错误信息显示:
java.lang.ClassNotFoundException:
但是这个消息的格式通常是这样的:
. lang。ClassNotFoundException: SomeNonExistingClass
为什么没有找到的类的名称丢失了?因为在示例中有一条指令引用了一个空类名(")。因此,您需要查找忘记指定类名的指令。在这里:
invokestatic main_65428301()I
应该是:
invokestatic default_class/main_65428301()I
这将解决您的问题。
你写的是:
编辑2:好了,我终于知道是哪里不对了!类名必须以大写字母开头!这解决了我的问题!无论如何,感谢所有试图帮助我的人!
因为既没有任何迹象表明这可能是一个原因,也不是实际情况。