ClassNotFoundException和NoClassDefFoundError你弄懂了嗎?

引言

Java程序開發中常見兩種查找不到Class的異常情況

  • java.lang.ClassNotFoundException
  • java.lang.NoClassDefFoundError

二者主要區別是顯式裝載的時候找不到類還是隱式裝載的時候找不到類。
在Java中,類需要被類加載器加到到JVM內存中才能被使用,類的裝載有顯式裝載和隱式裝載兩種方式,弄明白這兩種方式才能更好理解這兩種異常。

一、顯式裝載

顯式裝載指的是在程序中使用指定的方法加載指定的類,目前有以下三種情況

  • Class.forName()
  • ClassLoader的loadClass方法
  • ClassLoader的findSystemClass()方法(protected final,只能在本類或者繼承的子類纔可以使用)

當調用以上任何一個方法的時候,指定的類由類裝裝載器裝入。如果類已經加載,那麼只是返回一個引用;否則,類裝載器會通過委託模型加載類。

二、隱式裝載

隱式裝載發生在由於引用、實例化(new)或繼承導致加載類的時候(不是通過顯式方法調用)。在每種情況下,類的加載都是在幕後啓動的,JVM 會解析必要的引用並加載類。與顯式類裝入一樣,如果類已經被加載了,那麼只是返回一個引用;否則,類裝載器會通過委託模型加載類。

三、兩種異常的區別

類的加載通常組合了顯式和隱式。例如,類裝載器可能先顯式地加載一個類,然後再隱式地加載它引用的所有類。
ClassNotFoundException發生在顯式裝載類的時候查找不到對應的類文件;
NoClassDefFoundError發生在隱式裝載類的時候查找不到對應的類文件的時候,此時執行的類已經編譯但是在執行的時候找不到定義的類文件,也就是說引用的類在類路徑中沒有找到。

更多內容

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