当前位置: 首页 > 知识库问答 >
问题:

如何解决"java.lang.NoClassDefFoundError"?

鲍宁
2023-03-14

我在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图形运行它。Main(从命令行),它工作了。

更新非常晚#2

我没有使用Eclipse(只是记事本和JDK),上面的更新解决了我的问题。然而,这些答案中似乎有许多是针对Eclipse和IntelliJ IDEA的,但它们有相似的概念。

共有3个答案

岳凯康
2023-03-14

NoClassDefFoundError表示类在编译时出现在类路径中,但在运行时不存在于类路径中。

如果使用Eclipse,请确保将形状线点空间对象作为. classpath文件中的条目。

欧阳昊阳
2023-03-14

我想纠正别人对NoClassDefFoundError的看法。

NoClassDefFoundError发生的原因有多种,如:

  1. ClassNotFoundException--。未找到该引用类的类,无论它在编译时是否可用(即基类/子类)

在最初的问题中,这是第一种可以通过将类路径设置为引用的类JAR文件或其包文件夹来纠正的情况。

“在编译时可用”是什么意思?

  • 引用的类在代码中使用。
    例如:两个类,A和B(扩展A)。如果在代码中直接引用B,则在编译时可用,即A a=new B();

“编译时不可用”是什么意思?

  • 编译时类和运行时类是不同的,即,例如基类是使用子类的类名加载的,例如Class.for名称(类名)例如:两个类,A和B(扩展A)。代码有
    A a=Class.forName("B"). newInstance();
凤明朗
2023-03-14

编译代码后,您将得到。为程序中的每个类初始化文件。这些二进制文件是Java为执行程序而解释的字节码。NoClassDefFoundError表示负责动态加载类的类加载器(在本例中为java.net.URLClassLoader)找不到。类您尝试使用的类的文件。

如果所需的类不存在,代码将无法编译(除非类加载了反射),因此通常此异常意味着类路径不包括所需的类。请记住,类加载器(特别是java.net.URLClassLoader)将在类路径中的每个条目中的文件夹a/b/c/中查找包a. b. c中的类。已编译并试图使用的JAR文件。

例如,如果您有一个类com.example.Foo,编译后您将有一个类文件Foo.class。例如,您的工作目录是.../project/。该类文件必须放置在.../project/com/form中,并且将类路径设置为.../project/

旁注:我建议利用Java和JVM语言的惊人工具。Eclipse和IntelliJ IDEA等现代IDE以及Maven或Gradle等构建管理工具将帮助您不必担心类路径(同样多),而只需关注代码!也就是说,这个链接解释了在命令行上执行时如何设置类路径。

 类似资料:
  • 问题内容: 我已经尝试了Oracle Java教程中的两个示例。它们都可以正常编译,但是在运行时都出现以下错误: 我想我可能将Main.java文件放在错误的文件夹中。这是目录层次结构: 这里是 我在这里做错了什么? 更新 将Main类放入graphics包中(添加package graphics;到其中)后,将类路径设置为“ _test”(包含图形的文件夹),进行编译,然后使用java grap

  • 我已经在Oracle的Java教程中尝试了这两个示例。它们都编译得很好,但在运行时,都出现了以下错误: 我想文件可能在错误的文件夹中。 非常晚的更新#2 我没有使用Eclipse(只有记事本++和JDK),上面的更新解决了我的问题。然而,似乎这些答案中有许多是针对Eclipse和IntelliJ IDEA的,但它们有相似的概念。

  • 问题内容: 为什么此代码不起作用? 错误堆栈跟踪: 问题答案: 错误说明了一切: 使用 Selenium v​​3.x时 ,必须从 mozilla / geckodriver 下载 geckodriver.exe 并将其放置在系统中。接下来,您必须通过以下代码行设置system属性,并按如下所示在系统中提供 GeckoDriver 二进制文件的绝对路径: __ __ 最后,没有按最佳做法提及,而是

  • 问题内容: 为什么此代码不起作用? 错误堆栈跟踪: 问题答案: 错误说明了一切: 使用 Selenium v​​3.x时, 您必须从 mozilla / geckodriver 下载 geckodriver.exe 并将其放置在系统中。接下来,您必须按如下所示通过该行设置system属性,并按如下所示提供系统中 GeckoDriver 二进制文件的绝对路径: __ __ 最后,没有按最佳做法提及,

  • 问题内容: 我正在尝试编写简单的Java代码,以在控制台上显示MongoDB集合。我在类路径中添加了mongodb-driver-3.0.0.jar。 但是,当我尝试执行代码时,它在数据库连接行给了我以下错误: 线程“主”中的异常java.lang.NoClassDefFoundError:com.montan.app.MongoDbJdbc.main(MongoDbJdbc.java:12)上的

  • 问题内容: 我试图通过我的Web项目上的applet访问客户端的临时目录。 当我自己运行小程序时,它毫无问题地得到了。 当我尝试使用javascript并调用applet方法在我的项目上获取它时,我在javascript控制台上运行。当我尝试读取temp目录下的文件时,我也遇到同样的异常。 这正是我所看到的: 怎么解决? 问题答案: 最简单的解决方案是对applet进行签名。