Java之NoClassDefFoundError的原因及分析
ClassNotfoundException
java開(kāi)發(fā)中經(jīng)常遇到j(luò)ava.lang.ClassNotfoundException異常,ClassNotfoundException異常一般就是編譯時(shí)找不到類,Console臺(tái)就會(huì)輸出異常信息。
一般情況下,我們都會(huì)rebuild或者clean一下工程,讓項(xiàng)目重新編譯一遍。
兩個(gè)異常的區(qū)別
不過(guò)一遇到NoClassDefFoundError,我們有時(shí)也容易和ClassNotfoundException異常混淆。
雖然NoClassDefFoundError和ClassNotfoundException異常出現(xiàn)原因類似,都是因?yàn)榫幾g加載不到類導(dǎo)致的,但是卻有本質(zhì)的區(qū)別。
兩者的本質(zhì)區(qū)別就是:
- ClassNotfoundException時(shí)在編譯時(shí)JVM加載不到類或者找不到類導(dǎo)致的;
- 而NoClassDefError是在運(yùn)行時(shí)JVM加載不到類或者找不到類
NoClassDefFoundError錯(cuò)誤發(fā)生原因
為什么會(huì)發(fā)生NoClassDefFoundError錯(cuò)誤?
其實(shí)就是和Java虛擬機(jī)的工作原理有關(guān)了,下面簡(jiǎn)單介紹一下JVM的類加載機(jī)制
類加載器三個(gè)機(jī)制:委托、單一性、可見(jiàn)性
- 委托:指加載一個(gè)類的請(qǐng)求交給父類加載器,若父類加載器不可以找到或者加載到,再加載這個(gè)類
- 單一性:指子類加載器不會(huì)再次加載父類加載器已經(jīng)加載過(guò)的類
- 可見(jiàn)性:子類加載器可以看見(jiàn)父類加載器加載的所有類,而父類加載器不可以看到子類加載器加載的類
JVM的類加載機(jī)制的委托行機(jī)制,決定了類加載器只加載一次,子類加載器不會(huì)再加載父類加載器已經(jīng)加載過(guò)的類
所有在一些特定條件下就會(huì)出現(xiàn)編譯時(shí)可以加載到類,運(yùn)行時(shí)不可以加載到類,這時(shí)候就會(huì)出現(xiàn)java.lang.NoClassDefFoundError異常
NoClassDefFoundError可能出現(xiàn)的情況
目前有發(fā)現(xiàn)幾種情況:
1、一種情況就是因?yàn)殪o態(tài)變量加載不到原因
2、工程里沒(méi)有將jar添加到classpath,maven項(xiàng)目的,需要根據(jù)項(xiàng)目情況排查
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- java.lang.NoClassDefFoundError錯(cuò)誤的原因及解決方法
- java.lang.NoClassDefFoundError錯(cuò)誤解決辦法
- Java中的NoClassDefFoundError報(bào)錯(cuò)含義解析
- 解決java.lang.NoClassDefFoundError: android.support.v4.animation.AnimatorCompatHelper問(wèn)題
- Java中NoClassDefFoundError?和?ClassNotFoundException的區(qū)別
- Java NoClassDefFoundError 異常及解決方法
相關(guān)文章
JavaWeb開(kāi)發(fā)之模仿知乎首頁(yè)完整代碼
這篇文章主要介紹了JavaWeb開(kāi)發(fā)之模仿知乎首頁(yè)完整代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11
通過(guò)使用Byte?Buddy便捷創(chuàng)建Java?Agent
這篇文章主要為大家介紹了如何通過(guò)使用Byte?Buddy便捷創(chuàng)建Java?Agent的使用說(shuō)明,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
Java 中 Date 與 Calendar 之間的編輯與轉(zhuǎn)換實(shí)例詳解
這篇文章主要介紹了Java 中 Date 與 Calendar 之間的編輯與轉(zhuǎn)換 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
spring三級(jí)緩存以及為什么不用二級(jí)緩存解讀
Spring三級(jí)緩存機(jī)制解決了循環(huán)依賴問(wèn)題,通過(guò)一級(jí)緩存存放完全初始化的bean,二級(jí)緩存存放實(shí)例化但未完成依賴注入和初始化的bean,三級(jí)緩存存放bean的創(chuàng)建工廠,避免了重復(fù)創(chuàng)建和確保代理對(duì)象的正確生成2025-02-02
Java中使用json與前臺(tái)Ajax數(shù)據(jù)交互的方法
這篇文章主要為大家詳細(xì)介紹了Java中使用json與前臺(tái)Ajax數(shù)據(jù)交互的方法,分享Ajax獲取顯示Json數(shù)據(jù)的一種方法,感興趣的小伙伴們可以參考一下2016-06-06
Spring中@Configuration注解的使用場(chǎng)景
這篇文章主要介紹了Spring中@Configuration注解的使用場(chǎng)景,@Configuration注解是從Spring?3.0版本開(kāi)始加入的一個(gè)使Spring能夠支持注解驅(qū)動(dòng)開(kāi)發(fā)的標(biāo)注型注解,主要用于標(biāo)注在類上,需要的朋友可以參考下2023-11-11

