ClassNotFoundException和NoClassDefFoundError區別
ClassNotFoundException:
- 它是Exception,不是Error在Throwable體系中只是一個Exception,說明它是可恢復的
- 發生的時機
當應用試圖通過給定的name載入對應的class時可能丟擲此異常,找不到對應的class檔案時丟擲。常見的場景就是:- 呼叫class的forName方法時,找不到指定的類
- ClassLoader 中的 findSystemClass() 方法時,找不到指定的類
- ClassLoader 中的 loadClass() 方法時,找不到指定的類
NoClassDefFoundError
- Error級別,比Exception要嚴重
- JVM或者ClassLoader試圖載入一個class的definition的時候,找不到對應的class的definition,通常時new A()的時候
ClassNotFoundException的產生原因: Â
Java支援使用Class.forName方法來動態地載入類,任意一個類的類名如果被作為引數傳遞給這個方法都將導致該類被載入到JVM記憶體中,如果這個類在類路徑中沒有被找到,那麼此時就會在執行時丟擲ClassNotFoundException異常。
要解決這個問題很容易,唯一需要做的就是要確保所需的類連同它依賴的包存在於類路徑中。當Class.forName被呼叫的時候,類載入器會查詢類路徑中的類,如果找到了那麼這個類就會被成功載入,如果沒找到,那麼就會丟擲ClassNotFountException,除了Class.forName,ClassLoader.loadClass、ClassLOader.findSystemClass在動態載入類到記憶體中的時候也可能會丟擲這個異常。
另外還有一個導致ClassNotFoundException的原因就是:當一個類已經某個類載入器載入到記憶體中了,此時另一個類載入器又嘗試著動態地從同一個包中載入這個類。
NoClassDefFoundError產生的原因:
如果JVM或者ClassLoader例項嘗試載入(可以通過正常的方法呼叫,也可能是使用new來建立新的物件)類的時候卻找不到類的定義。要查詢的類在編譯的時候是存在的,執行的時候卻找不到了。這個錯誤往往是你使用new操作符來建立一個新的物件但卻找不到該物件對應的類。這個時候就會導致NoClassDefFoundError.
由於NoClassDefFoundError是有JVM引起的,所以不應該嘗試捕捉這個錯誤。
解決這個問題的辦法就是:查詢那些在開發期間存在於類路徑下但在執行期間卻不在類路徑下的類。
另:
ClassNotFoundException發生在裝入階段。
當應用程式試圖通過類的字串名稱,使用常規的三種方法裝入類,但卻找不到指定名稱的類定義時就丟擲該異常。
NoClassDefFoundError: 當目前執行的類已經編譯,但是找不到它的定義時,也就是說你如果編譯了一個類B,在類A中呼叫,編譯完成以後,你又刪除掉B,執行A的時候那麼就會出現這個錯誤
載入時從外儲存器找不到需要的class就出現ClassNotFoundException
連線時從記憶體找不到需要的class就出現NoClassDefFoundError
相關文章
- NoClassDefFoundError 和 ClassNotFoundException異常ErrorException
- 和區別
- ../和./和/的區別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- ||和??的區別
- /*和/**的區別
- java.lang.ClassNotFoundExceptionJavaException
- Synchronize和ReentrantLock區別ReentrantLock
- SSL和TLS 區別TLS
- jquery $(this) 和this的區別jQuery
- substr()和substring()區別
- JQuery this和$(this)的區別jQuery
- insert和insertSelective區別
- SCSS 和 SASS 區別CSS
- T和?的區別
- localStorage和sessionStorage區別Session
- BeanFactory和FactoryBean區別Bean
- Swift和Kotlin區別SwiftKotlin
- makefile =和:=的區別
- undefined 和 null 區別?UndefinedNull
- ibtis # 和 ¥ 區別
- Python之“==”和“is”區別Python
- null和undefined區別NullUndefined
- ++a和a++的區別
- stringbuilder和stringbuffer區別UI
- SpringCloud和Dubbo區別SpringGCCloud
- sleep()和wait()區別AI
- JoinPoint和ProceedingJoinPoint區別
- 127.0.0.0和localhost區別localhost
- ./ 和sh 的區別
- get和post區別
- url和uri區別
- innerHTML 和 innerTEXT 區別HTML
- js基本型別和引用型別區別JS型別
- workman 和swoole 區別 和異同
- Cookie 和 Session 關係和區別CookieSession
- 堆和棧的概念和區別