我已经通过此线程What causes and what are the differences between NoClassDefFoundError and 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方法。 findSystemClass
类ClassLoader中的方法。类中的loadClass方法
ClassLoader。




您必须了解,JVM无法实现所删除的class的定义,因为找不到class本身会自动抛出ClassNotFoundException

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

请注意,NoClassDefFoundError实际上不是例外,它是从Error派生的LinkageError,而ClassNotFoundException是直接从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方法的n可执行文件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

关于java - ClassNotFoundException与NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56662533/

10-12 04:15