要區(qū)分這兩個異常掏导,先要了解類裝載的顯式和隱式兩種方式
類裝入的方式有兩種 —— 顯式 或 隱式,兩者之間有些細(xì)微差異土匀。
顯式 類裝入發(fā)生在使用以下方法調(diào)用裝入的類的時候:
?cl.loadClass()(cl 是 java.lang.ClassLoader 的實例)
?Class.forName()(啟動的類裝入器是當(dāng)前類定義的類裝入器)
當(dāng)調(diào)用其中一個方法的時候舱殿,指定的類(以類名為參數(shù))由類裝入器裝入。如果類已經(jīng)裝入险掀,那么只是返回一個引用沪袭;否則,裝入器會通過委托模型裝入類樟氢。
隱式 類裝入發(fā)生在由于引用、實例化或繼承導(dǎo)致裝入類的時候(不是通過顯式方法調(diào)用)埠啃。在每種情況下,裝入都是在幕后啟動的碴开,JVM 會解析必要的引用并裝入類毅该。與顯式類裝入一樣,如果類已經(jīng)裝入了叹螟,那么只是返回一個引用鹃骂;否則罢绽,裝入器會通過委托模型裝入類畏线。
類的裝入通常組合了顯式和隱式類裝入良价。例如蒿叠,類裝入器可能先顯式地裝入一個類蚣常,然后再隱式地裝入它引用的所有類市咽。
ClassNotFoundException抵蚊;
當(dāng)應(yīng)用程序試圖通過類的字符串名稱,使用以下三種方法裝入類贞绳,但卻找不到指定名稱的類定義時拋出該異常,是顯式類裝載的拋出的異常冈闭。
1.類 Class 中的 forName() 方法。
2.類 ClassLoader 中的 findSystemClass() 方法遇八。
3.類 ClassLoader 中的 loadClass() 方法耍休。
NoClassDefFoundError:
如果 Java 虛擬機或 ClassLoader 實例試圖裝入類定義(作為正常的方法調(diào)用的一部分刃永,或者作為使用 new 表達式創(chuàng)建新實例的一部分)羊精,但卻沒有找到類定義時拋出該異常。
當(dāng)目前執(zhí)行的類已經(jīng)編譯园匹,但是找不到它的定義時劫灶,會存在 searched-for 類定義。
實際上供汛,這意味著 NoClassDefFoundError 的拋出,是不成功的隱式類裝入的結(jié)果涌穆。
簡單說來怔昨,就是引用的類在類路徑中沒有找到宿稀。
原文鏈接:https://blog.csdn.net/magister_feng/article/details/7459151