(轉)Java基礎之NoClassDefFoundError和ClassNotfoundException

ClassNotfoundException

java開發中經常遇到java.lang.ClassNotfoundException異常,ClassNotfoundException異常一般就是編譯時找不到類,Console臺就會輸出異常信息。一般情況下,我們都會rebuild或者clean一下工程,讓項目重新編譯一遍。

兩個異常的區別

不過一遇到NoClassDefFoundError,我們有時也容易和ClassNotfoundException異常混淆。雖然NoClassDefFoundError和ClassNotfoundException異常出現原因類似,都是因爲編譯加載不到類導致的,但是卻有本質的區別。

兩者的本質區別就是:
ClassNotfoundException時在編譯時JVM加載不到類或者找不到類導致的; 

而NoClassDefError是在運行時JVM加載不到類或者找不到類

NoClassDefFoundError錯誤發生原因

爲什麼會發生NoClassDefFoundError錯誤?
其實就是和Java虛擬機的工作原理有關了,下面簡單介紹一下JVM的類加載機制

類加載器三個機制:委託、單一性、可見性

委託:指加載一個類的請求交給父類加載器,若父類加載器不可以找到或者加載到,再加載這個類
單一性:指子類加載器不會再次加載父類加載器已經加載過的類
可見性:子類加載器可以看見父類加載器加載的所有類,而父類加載器不可以看到子類加載器加載的類

JVM的類加載機制的委託行機制,決定了類加載器只加載一次,子類加載器不會再加載父類加載器已經加載過的類

所有在一些特定條件下就會出現編譯時可以加載到類,運行時不可以加載到類,這時候就會出現java.lang.NoClassDefFoundError異常

NoClassDefFoundError可能出現的情況

目前有發現幾種情況
1、一種情況就是因爲靜態變量加載不到原因
2、工程裏沒有將jar添加到classpath,maven項目的,需要根據項目情況排查

我的出現的問題:jar或者類沒有發佈到tomcat的項目中,使用MyEclipse,可以查看項目的屬性-》Deployment -->Deployment Assembly,看看是否有錯誤。

轉:https://blog.csdn.net/u014427391/article/details/79743318

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