要區分這兩個異常,先要了解類裝載的顯式和隱式兩種方式java
類裝入的方式有兩種 —— 顯式 或 隱式,二者之間有些細微差別。web
顯式 類裝入發生在使用如下方法調用裝入的類的時候:
•cl.loadClass()(cl 是 java.lang.ClassLoader 的實例)
•Class.forName()(啓動的類裝入器是當前類定義的類裝入器)orm
當調用其中一個方法的時候,指定的類(以類名爲參數)由類裝入器裝入。若是類已經裝入,那麼只是返回一個引用;不然,裝入器會經過委託模型裝入類。繼承
隱式 類裝入發生在因爲引用、實例化或繼承致使裝入類的時候(不是經過顯式方法調用)。在每種狀況下,裝入都是在幕後啓動的,JVM 會解析必要的引用並裝入類。與顯式類裝入同樣,若是類已經裝入了,那麼只是返回一個引用;不然,裝入器會經過委託模型裝入類。字符串
類的裝入一般組合了顯式和隱式類裝入。例如,類裝入器可能先顯式地裝入一個類,而後再隱式地裝入它引用的全部類。虛擬機
ClassNotFoundException;it
當應用程序試圖經過類的字符串名稱,使用如下三種方法裝入類,但卻找不到指定名稱的類定義時拋出該異常,是顯式類裝載的拋出的異常。
1.類 Class 中的 forName() 方法。
2.類 ClassLoader 中的 findSystemClass() 方法。
3.類 ClassLoader 中的 loadClass() 方法。io
NoClassDefFoundError:編譯
若是 Java 虛擬機或 ClassLoader 實例試圖裝入類定義(做爲正常的方法調用的一部分,或者做爲使用 new 表達式建立新實例的一部分),但卻沒有找到類定義時拋出該異常。
當目前執行的類已經編譯,可是找不到它的定義時,會存在 searched-for 類定義。
實際上,這意味着 NoClassDefFoundError 的拋出,是不成功的隱式類裝入的結果。
簡單說來,就是引用的類在類路徑中沒有找到。webkit