我对Java还是很陌生,只想从命令行运行javac
和java
。
我当前的目录内容是:
hmank ~/c/J/naive » ls
HelloWorld.class HelloWorld.java
HelloWorld.java
中的代码是:
hmank ~/c/J/naive » cat HelloWorld.java
package com.imshuai.javalinux;
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello, World!");
}
}
我知道我应该先运行javac -d . HelloWorld.java
,然后运行java com.imshuai.javalinux.HelloWorld
。
但是,我想看看如果我直接运行javac HelloWorld.java
和java HelloWorld
会发生什么!
结果是javac
可以编译HelloWorld.java
,但是运行java HelloWorld
时出现错误:
java.lang.NoClassDefFoundError: com/imshuai/javalinux/HelloWorld (wrong name: HelloWorld)
我对NoClassDefFoundError
感到困惑,因为我在当前目录中定义了HelloWorld
。并且jvm
必须找到HelloWorld.class
并加载它,否则jvm
无法获得关于com/imshuai/javalinux/HelloWorld
的信息。
事实上,如果我这样做
javac -d . HelloWorld.java
java HelloWorld
我在对与错的地方都得到了NoClassDefFoundError
和HelloWorld.class
。
我认为,在上述错误情况下,jvm
应该报告一个class location not match package
错误,导致jvm
找到该类,并且没有正确的位置放置{{1} },以使HelloWorld.class
成功运行。
还有,您能告诉我为什么java HelloWorld
决定举报jvm
的原因,java.lang.NoClassDefFoundError
的含义是什么?
答案 0 :(得分:1)
问题出在包组织中,因为您指定了package com.imshuai.javalinux
但缺少正确的文件夹结构。
您应该根据软件包的声明将类安排在文件夹中。
-d .
命令中的javac
之所以起作用,是因为它创建了包的文件夹结构,而不是将所有.class
文件都放在根目录中。
因此,如果您运行java com/imshuai/javalinux/HelloWorld
,则输出为Hello, World!
并且程序可以正常工作。
另一种解决方案是将该文件夹添加到java类路径中。