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。