我已经通过此线程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/