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+ 閱讀量

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.