目录结构:
ClassOne.java
ClassOne.class
/dir
ClassTwo.java
ClassTwo.class
我纯粹是用这个终端。我都使用
javac
进行编译,以生成类文件。ClassOne.java
import dir.ClassTwo;
public class ClassOne{
public static void main(String[] args){
ClassTwo two = new ClassTwo();
two.printIt();
}
}
ClassTwo.java
package dir;
public class ClassTwo {
void printIt() {
System.out.println("I am class two!");
}
public static void main(String[] args){
System.out.println("Hello");
}
}
运行ClassOne.java可以按预期工作(由于ClassTwo.printIt()设置为默认值,导致编译器错误)。但是,让我感到困扰的是运行ClassTwo时得到的
NoClassDefFoundError
。当我在顶部添加
package dir;
语句时,我注意到了错误-如果没有它,ClassTwo会按预期运行,但ClassOne会出错。这是在定义
package dir;
的情况下运行ClassTwo时遇到的错误:Exception in thread "main" java.lang.NoClassDefFoundError: ClassTwo (wrong name: dir/ClassTwo)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:480)
为什么会这样呢?
最佳答案
因为包名称是类名称的一部分。上一个文件夹并运行类似
java -cp . dir.ClassTwo
关于java - 在具有main()的类中定义包名称时,出现NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32533686/