Java 中 ClassNotFoundException 和 NoClassDefFoundError 有什么区别?\n


ClassNotFoundExceptionNoClassDefFoundError 都是当 JVM 或类加载器在运行时加载类时找不到合适的类时发生的错误。ClassNotFoundException 是一个受检异常,而 NoClassDefFoundError 是一个错误,属于非受检异常。

有不同类型的 ClassLoader 从不同的来源加载类,有时可能会导致库 JAR 文件丢失或类路径不正确,从而导致加载器无法在运行时加载类。

ClassNotFoundException

当我们尝试使用反射在运行时加载类,并且如果这些类文件丢失,则应用程序或程序会抛出 ClassNotFoundException 异常。在编译时没有需要检查的东西,因为它是在运行时加载类。

示例

在线演示

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.classTest2.class,在运行 Test2 类时,只需删除 Test1.class 文件,然后我们将得到如下所示的 NoClassDefFoundError

输出

Exception in thread "main" java.lang.NoClassDefFoundError: Test1
         at Test2.main(Test2.java:9)

更新于: 2019年7月30日

4K+ 阅读量

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告