我最近开始学习Java,但是我遇到了一些与NoClassDefFoundError
有关的问题。我试图从这个网站和其他地方研究解决方案,但仍然无法解决它们。我使用CLASSPATH环境变量集从Windows 7命令提示符运行我的程序,而不是为每个程序运行定义它。它设置为C:
。为了排除故障,我创建了一个简化目录结构的测试包。带继承类的Java NoClassDefFoundError
在C:\test
,我有Shape.java
和Circle.java
。 Shape.java
看起来是这样的:
package test;
class Shape {
void draw() { System.out.println("Drawing a new shape"); }
}
和Circle.java
看起来是这样的:
package test;
public class Circle extends Shape {
public static void main(String[] args) {
Circle round = new Circle();
round.draw();
}
}
如果我在与操作命令提示符像
C:\>javac test\Shape.java
C:\>javac test\Circle.java
和编译都Shape.java
和Circle.java
从C:\
运行编译的Circle.class
文件,如
C:\java test\Circle
我得到的输出我想到:
Drawing a new shape
但是,如果我编译从C:\test
像
C:\test>javac Shape.java
C:\test>javac Circle.java
内Shape.java
和Circle.java
,然后尝试从任何地方像运行Circle.class
C:\test>java Circle
或类似这样的
C:\> java test\Circle
我收到以下错误消息。
Exception in thread "main" java.lang.NoClassDefFoundError: Circle (wrong name: t
est/Circle)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
2)
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:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
有人能解释为什么它是在JAVA文件从C:\test
文件夹中编译,但编译后的文件圈产生错误?我的CLASSPATH有问题吗?感谢您的阅读和希望即将到来的解决方案!
编辑:我做更多的测试,事实证明,如果我编译从C:\test
目录Shape.java
和Circle.java
文件,但是从C:\
目录中运行它,它的工作原理。这会改变什么吗?
编辑2:经过更多的测试后,事实证明,我可以事实上编译并运行C:\ test目录下的Shape.java和Circle.java文件,只要我使用命令java test.Circle 。我误解了JVM寻找类的方式。我现在明白它在分析包导入语句时使用与编译器相同的方法。
使用eclipse工作台。 – Makky
使用'java test.Circle' –
您应该认真使用像Eclipse这样的IDE。 –