ClassNotFoundException 與 NoClassDefFoundError 的區(qū)別
答:當(dāng) JVM 或 ClassLoader 在加載類時找不到對應(yīng)類就會引發(fā) NoClassDefFoundError 和 ClassNotFoundException,他們的區(qū)別如下:
NoClassDefFoundError 和 ClassNotFoundException 都是由于在 CLASSPATH 下找不到對應(yīng)的類而引起的浴捆。
當(dāng)應(yīng)用運行時沒有找到對應(yīng)的引用類就會拋出 NoClassDefFoundError选泻,當(dāng)在代碼中通過類名顯式加載類(如使用 Class.forName())時沒有找到對應(yīng)的類就會拋出 ClassNotFoundException美莫。
再稍微詳細(xì)點來說,NoClassDefFoundError 表示該類在編譯階段可以找到窝撵,但在運行時找不到了襟铭,另外有時靜態(tài)塊的初始化過程也會導(dǎo)致 NoClassDefFoundError。而 ClassNotFoundException 一般發(fā)生在通過反射或者 ClassLoader 依據(jù)類名加載類時類不存在赐劣。
此外 NoClassDefFoundError 是 Error入撒,是不受檢查類型的異常茅逮;而 ClassNotFoundException 是受檢查類型的異常,需要進(jìn)行異常捕獲献雅,否則會導(dǎo)致編譯錯誤。
再深入來說挺身,NoClassDefFoundError 是鏈接錯誤,發(fā)生在 JVM 類加載流程的鏈接階段墙贱,當(dāng)解析引用的時候找不到對應(yīng)的類就會拋出 NoClassDefFoundError;而 ClassNotFoundException 一般發(fā)生在類加載流程的加載階段伊脓。