我已经尝试了Oracle的Java教程中的两个示例。它们都可以编译,但在运行时,都会出现这个错误:
Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square
at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
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)
... 1 more
我想我可能把Main.java文件放在错误的文件夹里了。
下面是目录层次结构:
graphics
├ Main.java
├ shapes
| ├ Square.java
| ├ Triangle.java
├ linepoint
| ├ Line.java
| ├ Point.java
├ spaceobjects
| ├ Cube.java
| ├ RectPrism.java
这是Main.java:
import graphics.shapes.*;
import graphics.linepoint.*
import graphics.spaceobjects.*;
public class Main {
public static void main(String args[]) {
Square s = new Square(2, 3, 15);
Line l = new Line(1, 5, 2, 3);
Cube c = new Cube(13, 32, 22);
}
}
我哪里做错了?
更新
在我把Main类放入图形包之后(我添加了图形包;对于它),将类路径设置为“_test”(包含图形的文件夹),编译它,并使用Java图形运行它。Main(从命令行),它工作正常。
真的很晚更新#2
我没有使用Eclipse(只有notepad++和JDK),上面的更新解决了我的问题。然而,这些答案中似乎有许多是针对Eclipse和IntelliJ IDEA的,但它们具有类似的概念。
我想纠正其他人对NoClassDefFoundError的看法。
NoClassDefFoundError的发生有多种原因,比如:
没有为该引用的类找到.class,无论它在编译时是否可用(i. ClassNotFoundException)。E基类/子类)。
类文件已定位,但在初始化静态变量时引发异常
类文件定位,在初始化静态块时引发异常
在最初的问题中,这是第一个可以通过将CLASSPATH设置为引用的类JAR文件或其包文件夹来纠正的情况。
“在编译时可用”是什么意思?
在代码中使用引用的类。例如:两个类,A和B(扩展A)。如果B在代码中直接引用,则在编译时可用,即A A = new B();
“编译时不可用”是什么意思?
编译时类和运行时类是不同的,例如,基类是使用子类的类名加载的
forname(“名称”)
例如:两个类,A和B(扩展A)
A A = Class.forName("B").newInstance();
Java中的NoClassDefFoundError:
定义:
如果一个类在编译时存在,但在运行时java类路径中不可用,则会出现NoClassDefFoundError。通常,当你获得NoClassDefFoundError时,你会在log中看到下面这行:
线程“main”异常
可能的原因:
The class is not available in Java Classpath.
You might be running your program using jar command and class was not defined in manifest file's ClassPath attribute.
Any start-up script is overriding Classpath environment variable.
Because NoClassDefFoundError is a subclass of java.lang.LinkageError it can also come if one of it dependency like native library may not available.
Check for java.lang.ExceptionInInitializerError in your log file. NoClassDefFoundError due to the failure of static initialization is quite common.
If you are working in J2EE environment than the visibility of Class among multiple Classloader can also cause java.lang.NoClassDefFoundError, see examples and scenario section for detailed discussion.
可能的决议:
验证所有必需的Java类都包含在应用程序的类路径中。最常见的错误是,在开始执行依赖于一些外部库的Java应用程序之前,没有包括所有必要的类。
应用程序的类路径是正确的,但是classpath环境变量在应用程序执行之前被重写。
验证前面提到的ExceptionInInitializerError没有出现在应用程序的堆栈跟踪中。
资源:
解决Java J2EE中Java .lang. noclassdeffounderror的3种方法
noclassdeffounderror -如何解决没有类Def发现错误