NoClassDefFoundError錯誤發(fā)生的原因
NoClassDefFoundError錯誤的發(fā)生赘阀,是因為Java虛擬機在編譯時能找到合適的類纤壁,而在運行時不能找到合適的類導致的錯誤。例如在運行時我們想調用某個類的方法或者訪問這個類的靜態(tài)成員的時候酌媒,發(fā)現(xiàn)這個類不可用,此時Java虛擬機就會拋出NoClassDefFoundError錯誤喇辽。與ClassNotFoundException的不同在于雨席,這個錯誤發(fā)生只在運行時需要加載對應的類不成功,而不是編譯時發(fā)生陡厘。
簡單總結就是,NoClassDefFoundError發(fā)生在編譯時對應的類可用云茸,而運行時在Java的classpath路徑中谤饭,對應的類不可用導致的錯誤懊纳。
NoClassDefFoundError和ClassNotFoundException區(qū)別
NoClassDefFoundError發(fā)生在JVM在動態(tài)運行時亡容,根據(jù)你提供的類名,在classpath中找到對應的類進行加載闺兢,但當它找不到這個類時,就發(fā)生了java.lang.NoClassDefFoundError的錯誤阱佛,而ClassNotFoundException是在編譯的時候在classpath中找不到對應的類而發(fā)生的錯誤戴而。ClassNotFoundException比NoClassDefFoundError容易解決翩蘸,是因為在編譯時我們就知道錯誤發(fā)生,并且完全是由于環(huán)境的問題導致催首。而如果你在J2EE的環(huán)境下工作郎任,并且得到NoClassDefFoundError的異常,而且對應的錯誤的類是確實存在的舶治,這說明這個類對于類加載器來說,可能是不可見的尺锚。
怎么解決NoClassDefFoundError錯誤
很明顯NoClassDefFoundError的錯誤是因為在運行時類加載器在classpath下找不到需要加載的類惜浅,所以我們需要把對應的類加載到classpath中,或者檢查為什么類在classpath中是不可用的坛悉,這個發(fā)生可能的原因如下:
1.對應的Class在java的classpath中不可用
你可能用jar命令運行你的程序,但類并沒有在jar文件的manifest文件中的classpath屬性中定義
2.可能程序的啟動腳本覆蓋了原來的classpath環(huán)境變量
因為NoClassDefFoundError是java.lang.LinkageError的一個子類挣轨,所以可能由于程序依賴的原生的類庫不可用而導致
3.檢查日志文件中是否有java.lang.ExceptionInInitializerError這樣的錯誤空民,NoClassDefFoundError有可能是由于靜態(tài)初始化失敗導致的
如果你工作在J2EE的環(huán)境羞迷,有多個不同的類加載器画饥,也可能導致NoClassDefFoundError