如何解决java.lang.NoClassDefFoundError?
我已经尝试了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类放入graphics包中(添加package graphics;到其中)后,将类路径设置为“ _test”(包含图形的文件夹),进行编译,然后使用java graphics.Main(从命令行)运行它,即可正常工作。
我没有使用Eclipse(只是Notepad ++和JDK),因此上述更新解决了我的问题。但是,似乎这些答案中有许多是针对Eclipse和IntelliJ的,但是它们具有相似的概念。
回答:
编译代码后,最终将得到.class
程序中每个类的文件。这些二进制文件是Java解释为执行程序的字节码。该NoClassDefFoundError
指示类加载器(在这种情况下java.net.URLClassLoader
),这是负责动态加载类,无法找到.class
该类你试图使用的文件。
如果不存在所需的类(除非使用反射加载了类),则你的代码将无法编译,因此通常此异常意味着你的类路径不包含所需的类。请记住,类加载器(特别是java.net.URLClassLoader
)将在类路径中每个条目中的文件夹abc中的a / b / c /文件夹中查找类。NoClassDefFoundError
也可能表明你缺少编译时要使用的.jar文件的传递依赖项。
例如,如果你有一个类com.example.Foo
,则在编译后将有一个类文件Foo.class
。假设你的工作目录为.../project/
。该类文件必须放在中.../project/com/example
,并且你将你的类路径设置为.../project/
。
旁注:我建议你利用Java和JVM语言中已有的惊人工具。诸如Eclipse和IDEA之类的现代IDE以及诸如Maven或Gradle之类的构建管理工具将帮助你不必担心类路径(过多地担心)并专注于代码!就是说,此链接说明了在命令行执行时如何设置类路径。
以上是 如何解决java.lang.NoClassDefFoundError? 的全部内容, 来源链接: utcz.com/qa/430932.html