Java 中的 ClassNotFoundException 和 NoClassDefFoundError 有什么区别?\
javaobject oriented programmingprogramming
ClassNotFoundException 和 NoClassDefFoundError 都是 JVM 或 ClassLoader 在运行时加载时无法找到适当类时产生的错误。 ClassNotFoundException 是已检查异常,而 NoClassDefFoundError 是未检查异常。
有不同类型的 ClassLoader 从不同的来源加载类,有时可能会导致库 JAR 文件丢失或类路径不正确,从而导致加载器无法在运行时加载类。
ClassNotFoundException
ClassNotFoundException 当我们尝试使用 Reflection 在运行时加载类时,如果这些类文件丢失,则应用程序或程序将抛出 ClassNotFoundException Exception。由于它是在运行时加载类,因此在编译时无需检查任何内容。
示例
public class ClassNotFoundExceptionTest { public static void main(String[] args) { try { Class.forName("Test"); } catch (ClassNotFoundException cnfe) { System.err.println("You are trying to search for a class is not existing. "+cnfe); } } }
输出
You are trying to search for a class is not existing. java.lang.ClassNotFoundException: Test
NoClassDefFoundError
NoClassDefFoundError 当某个类已使用类路径中的特定类进行编译,但在运行时无法使用相同的类时,会抛出该错误。缺少 JAR 文件是导致 NoClassDefFoundError 的最基本原因。根据 Java API 文档,"编译当前执行的类时,搜索到的类定义存在,但无法再找到该定义。"
示例
class Test1 { public void show() { System.out.println("show() method called"); } } public class Test2 { public static void main(String[] args) { Test1 t = new Test1(); t.show(); } }
当我们编译这两个类时,我们将得到两个类文件 Test1.class 和 Test2.class,而运行 Test2 类时,只需删除 Test1.class 文件,然后我们将得到 NoClassDefFoundError ,如下所示
输出
Exception in thread "main" java.lang.NoClassDefFoundError: Test1 at Test2.main(Test2.java:9)