在这种情况下如何解释NoClassDefFoundError?

时间:2019-08-13 23:53:16

标签: java javac noclassdeffounderror

我对Java还是很陌生,只想从命令行运行javacjava

我当前的目录内容是:

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.javajava 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

我在对与错的地方都得到了NoClassDefFoundErrorHelloWorld.class


我认为,在上述错误情况下,jvm应该报告一个class location not match package错误,导致jvm找到该类,并且没有正确的位置放置{{1} },以使HelloWorld.class成功运行。


还有,您能告诉我为什么java HelloWorld决定举报jvm的原因,java.lang.NoClassDefFoundError的含义是什么?

1 个答案:

答案 0 :(得分:1)

问题出在包组织中,因为您指定了package com.imshuai.javalinux但缺少正确的文件夹结构。

您应该根据软件包的声明将类安排在文件夹中。

-d .命令中的javac之所以起作用,是因为它创建了包的文件夹结构,而不是将所有.class文件都放在根目录中。

因此,如果您运行java com/imshuai/javalinux/HelloWorld,则输出为Hello, World!并且程序可以正常工作。

另一种解决方案是将该文件夹添加到java类路径中。