ClassNotFoundException和NoClassDefFoundError區別

ClassNotFoundException:web

  • 它是Exception,不是Error在Throwable體系中只是一個Exception,說明它是可恢復的
  • 發生的時機
    當應用試圖經過給定的name加載對應的class時可能拋出此異常,找不到對應的class文件時拋出。常見的場景就是:
    • 調用class的forName方法時,找不到指定的類
    • ClassLoader 中的 findSystemClass() 方法時,找不到指定的類
    • ClassLoader 中的 loadClass() 方法時,找不到指定的類

NoClassDefFoundErrorsvg

  • Error級別,比Exception要嚴重
  • JVM或者ClassLoader試圖加載一個class的definition的時候,找不到對應的class的definition,一般時new A()的時候

ClassNotFoundException的產生緣由: Â
Java支持使用Class.forName方法來動態地加載類,任意一個類的類名若是被做爲參數傳遞給這個方法都將致使該類被加載到JVM內存中,若是這個類在類路徑中沒有被找到,那麼此時就會在運行時拋出ClassNotFoundException異常。xml

要解決這個問題很容易,惟一須要作的就是要確保所需的類連同它依賴的包存在於類路徑中。當Class.forName被調用的時候,類加載器會查找類路徑中的類,若是找到了那麼這個類就會被成功加載,若是沒找到,那麼就會拋出ClassNotFountException,除了Class.forName,ClassLoader.loadClass、ClassLOader.findSystemClass在動態加載類到內存中的時候也可能會拋出這個異常。對象

另外還有一個致使ClassNotFoundException的緣由就是:當一個類已經某個類加載器加載到內存中了,此時另外一個類加載器又嘗試着動態地從同一個包中加載這個類。內存

NoClassDefFoundError產生的緣由:
若是JVM或者ClassLoader實例嘗試加載(能夠經過正常的方法調用,也多是使用new來建立新的對象)類的時候卻找不到類的定義。要查找的類在編譯的時候是存在的,運行的時候卻找不到了。這個錯誤每每是你使用new操做符來建立一個新的對象但卻找不到該對象對應的類。這個時候就會致使NoClassDefFoundError.開發

因爲NoClassDefFoundError是有JVM引發的,因此不該該嘗試捕捉這個錯誤。字符串

解決這個問題的辦法就是:查找那些在開發期間存在於類路徑下但在運行期間卻不在類路徑下的類。it

另:
ClassNotFoundException發生在裝入階段。
當應用程序試圖經過類的字符串名稱,使用常規的三種方法裝入類,但卻找不到指定名稱的類定義時就拋出該異常。io

NoClassDefFoundError: 當目前執行的類已經編譯,可是找不到它的定義時,也就是說你若是編譯了一個類B,在類A中調用,編譯完成之後,你又刪除掉B,運行A的時候那麼就會出現這個錯誤編譯

加載時從外存儲器找不到須要的class就出現ClassNotFoundException 鏈接時從內存找不到須要的class就出現NoClassDefFoundError

相關文章
相關標籤/搜索