ClassNotFoundException和NoClassDefFoundError的區別

1. ClassNotFoundException

(1) 發生原因

當通過以下3種方法根據類名加載類,但是又沒有找到類的定義的時候,就會拋出ClassNotFoundException異常:

Class.forName()
ClassLoader.findSystemClass()
ClassLoader.loadClass()

 

(2) 類型

看ClassNotFoundException的類繼承關係,它是從Exception繼承下來的,因此屬於程序運行中可以預料的異常,應該在代碼中進行捕獲,並進行相應的處理。
 

package test;

public class TestClassLoading {
  public static void main(String[] args) {
    System.out.println("begin");
    try {
      Class.forName("Test");
    } catch(Exception e)
    {
      System.out.println("catch exception");
    }
    System.out.println("finished");
  }
}

class Test {
  public void test() {
    
  }
}

 

(3) 代碼示例

程序編譯完成之後,刪除Test.class文件,執行程序,這時程序會輸出以下內容:

begin
catch exception
finished

說明程序能夠捕獲ClassNotFoundException異常,並且異常捕獲了之後程序還能繼續運行。

2. NoClassDefFoundError

(1) 發生原因

當編譯的時候能夠找到類定義,但是通過new的方式創建對象,或者是通過直接的方法調用的時候卻找不到類定義,這時候會拋出NoClassDefFoundError異常。

(2) 類型

NoClassDefFoundError是從Error繼承下來的,屬於錯誤,JVM認爲這類錯誤會導致程序處於非正常狀態,因此不應該捕獲這類異常。
 

(3) 代碼示例

package test;

public class TestClassLoading {
  public static void main(String[] args) {
    System.out.println("begin");
    try {
      Test test = new Test();
    } catch(Exception e)
    {
      System.out.println("catch exception");
    }
    System.out.println("finished");
  }
}

class Test {
  public void test() {
    
  }
}

 程序編譯完成之後,刪除Test.class文件,執行程序,這時程序會輸出以下內容:

begin
Exception in thread "main" java.lang.NoClassDefFoundError: test/Test
	at test.TestClassLoading.main(TestClassLoading.java:7)
Caused by: java.lang.ClassNotFoundException: test.Test
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	... 1 more

因爲NoClassDefFoundError不是從Exception繼承下來的,因爲這裏的catch無法捕獲到這個Error。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章