当前位置: 首页 > 面试题库 >

ClassNotFoundException与NoClassDefFoundError

赵雅懿
2023-03-14
问题内容

我经历了这个线程,什么原因以及NoClassDefFoundError和ClassNotFoundException之间有什么区别?
这是线程中具有最大ups的ans之一: NoClassDefFoundError :“因此,似乎 在成功编译源代码时发生
了NoClassDefFoundError ,但是在运行时未找到所需的类文件
。这可能是在分发或生产JAR文件时可能会发生某些情况,其中并未包含所有必需的类文件。”

ClassNotFoundException
:至于ClassNotFoundException,似乎是由于试图在运行时对类进行反射性调用而引起的,但程序尝试调用的类不存在。

我做了一个小实验。我创建了一个主类 A 类,并尝试从中调用其他类 B 类,编译成功。

然后我删除了在类A中被调用的类B。我得到了 java.lang.ClassNotFoundException,
但是按照脚步的答案,我应该有NoClassDefFoundError(源代码已成功编译,但在运行时找不到类文件)谁能解释我在线程中对ans的解释中缺少什么?

package com.random;

public class A {

    public static void main(String[] args) {
        B b= new B();

    }

}

 package com.random;

public class B {



}

问题答案:

NoClassDefFoundError

如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为常规方法调用的一部分或使用新表达式创建新实例的一部分)而抛出,则找不到该类的定义。

当前正在编译的类在编译时就存在搜索到的类定义,但是无法再找到该定义。

ClassNotFoundException

当应用程序尝试使用以下方式通过其字符串名称加载类时,抛出该错误:类Class中的forName方法。类ClassLoader中的findSystemClass方法。类ClassLoader中的loadClass方法。

您必须了解,找不到被删除JVM的定义class,因为class找不到自动抛出的本身ClassNotFoundException

发生此异常,runtime因此无论是否先编译都没有关系,您删除了文件,因此找不到它并抛出exception

请注意,这NoClassDefFoundError实际上不是例外,它是Error从派生LinkageErrorClassNotFoundException直接从派生的java.lang.Exception

要恢复,NoClassDefFoundError全局仅表示根据代码应存在但实际上不存在(或不在类路径中)的JVM尝试访问。runtime``compiled

重现ClassNotFoundException的示例

public class ClassNotFoundExceptionExample {

    private static final String CLASS_TO_LOAD = "main.java.Utils";

    public static void main(String[] args) {
        try {
            Class loadedClass = Class.forName(CLASS_TO_LOAD);
            System.out.println("Class " + loadedClass + " found successfully!");
        }
        catch (ClassNotFoundException ex) {
            System.err.println("A ClassNotFoundException was caught: " + ex.getMessage());
            ex.printStackTrace();
        }
    }
}

重现NoClassDefFoundError的示例

创建一个简单的类 Test

public class Test {
        public Test() {
                System.out.println("A new instance of the Test class was created!");
        }
}

和一堂课 NoClassDefFoundErrorExample

public class NoClassDefFoundErrorExample {
        private static Test test = new Test();

        public static void main(String[] args) {
                System.out.println("The definition of Test was found!");
        }
}

现在创建.jar执行该main方法的可执行文件。您可以Manifest.txt.jar

Main-Class: NoClassDefFoundErrorExample

现在运行以下命令

javac Test.java
javac NoClassDefFoundErrorExample.java
jar cfm NoClassDefFoundErrorExample.jar Manifest.txt NoClassDefFoundErrorExample.class
java -jar NoClassDefFoundErrorExample.jar

注意NoClassDefFoundError

Exception in thread "main" java.lang.NoClassDefFoundError: TestClass
    at NoClassDefFoundErrorExample.(NoClassDefFoundErrorExample.java:2)
Caused by: java.lang.ClassNotFoundException: TestClass
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    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


 类似资料:
  • 一个非常简单的应用程序,API level 24(Android 7.0),试图在实际物理设备上的唯一活动中加载网络视图,在日志中给出以下信息并停止应用程序: 和 和 怎么回事?某种版本/依赖性问题?如何纠正? 用于WebView的XML: WebView代码: 完整项目:https://github.com/qabi/webviewtest

  • 问题内容: 我正在IntelliJ中使用Maven。我有一类使用: pom.xml文件中的Maven依赖项: 我可以做并成功建立。但是当我尝试运行它时,我得到: 错误:java.lang.ClassNotFoundException:org.json.JSONObject 我在这里还有什么想念的吗?谢谢! 问题答案: 将json jar 添加到您的类路径 或使用 或将其添加到您的Maven pom

  • 问题内容: 我正在尝试进行Google Maps活动,但是出现LogCat错误,我的应用程序崩溃了。注册API密钥时,我使用了android提供的编码,所以我不知道为什么它不起作用。我需要帮助解决此问题。 LogCat XML文件 Java文件 问题答案: 在文件中添加这样的内容。

  • 问题内容: 这是我的错误代码。我的已导入为外部罐子。 堆栈跟踪: 问题答案: 这行导致,因为您尚未将文件放置在项目的lib文件夹中。或您尚未设置所需罐子的

  • 我有一个使用本地安装的web开发项目。我正在尝试使用Microsoft的jdbc驱动程序()连接到。 位于我的应用程序构建路径中: 我正在出口它。此外,在Tomcat应用程序目录的< code>lib文件夹中,我还放置了< code>sqljdbc41.jar的副本。 没有编译错误,但是在运行时,当我尝试加载SQL服务器驱动程序时,我会得到以下结果: 以下代码块中引发异常: 我看到很多关于这个话题

  • 问题内容: 因此,我今天在开发Android程序时遇到问题。我有一个将XML字符串转换为Java对象(第三方)的类,并且可以在常规Java项目中正常工作,但是在Android上却收到以下奇怪错误: 我出于明显的原因隐藏了我的应用程序名称和程序包,但我想知道是否有人遇到过此类问题。类在正确的包中,这是我添加的库。我之前引用的其他类也可以进行。还有其他原因抛出吗? 谢谢杰克 问题答案: 这是我目前拥有