NoClassDefFoundError
如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为常规方法调用的一部分或使用新表达式创建新实例的一部分)而抛出,则找不到该类的定义。
当前正在编译的类在编译时就存在搜索到的类定义,但是无法再找到该定义。
ClassNotFoundException
当应用程序尝试使用以下方式通过其字符串名称加载类时,抛出该错误:类Class中的forName方法。类ClassLoader中的findSystemClass方法。类ClassLoader中的loadClass方法。
您必须了解,找不到被删除
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执行该
main方法的可执行文件。您可以
Manifest.txt在
.jar
Main-Class: NoClassDefFoundErrorExample
现在运行以下命令
javac Test.javajavac NoClassDefFoundErrorExample.javajar cfm NoClassDefFoundErrorExample.jar Manifest.txt NoClassDefFoundErrorExample.classjava -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



