NoClassDefFoundError和ClassNotFoundException區別

很容易把java.lang.NoClassDefFoundError和java.lang.ClassNotfoundException這兩個錯誤搞混,事實上這兩個錯誤是徹底不一樣的。java

NoClassDefFoundError錯誤發生的緣由

NoClassDefFoundError錯誤的發生,是由於Java虛擬機在編譯時能找到合適的類,而在運行時不能找到合適的類致使的錯誤。例如在運行時咱們想調用某個類的方法或者訪問這個類的靜態成員的時候,發現這個類不可用,此時Java虛擬機就會拋出NoClassDefFoundError錯誤。與ClassNotFoundException的不一樣在於,這個錯誤發生只在運行時須要加載對應的類不成功,而不是編譯時發生。不少Java開發者很容易在這裏把這兩個錯誤搞混。spa

簡單總結就是,NoClassDefFoundError發生在編譯時對應的類可用,而運行時在Java的classpath路徑中,對應的類不可用致使的錯誤。.net

NoClassDefFoundError和ClassNotFoundException區別

咱們常常被java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError這兩個錯誤迷惑不清,儘管他們都與Java classpath有關,可是他們徹底不一樣。NoClassDefFoundError發生在JVM在動態運行時,根據你提供的類名,在classpath中找到對應的類進行加載,但當它找不到這個類時,就發生了java.lang.NoClassDefFoundError的錯誤,而ClassNotFoundException是在編譯的時候在classpath中找不到對應的類而發生的錯誤。ClassNotFoundException比NoClassDefFoundError容易解決,是由於在編譯時咱們就知道錯誤發生,而且徹底是因爲環境的問題致使。而若是你在J2EE的環境下工做,而且獲得NoClassDefFoundError的異常,並且對應的錯誤的類是確實存在的,這說明這個類對於類加載器來講,多是不可見的。日誌

怎麼解決NoClassDefFoundError錯誤

根據前文,很明顯NoClassDefFoundError的錯誤是由於在運行時類加載器在classpath下找不到須要加載的類,因此咱們須要把對應的類加載到classpath中,或者檢查爲何類在classpath中是不可用的,這個發生可能的緣由以下:開發

  1. 對應的Class在java的classpath中不可用
  2. 你可能用jar命令運行你的程序,但類並無在jar文件的manifest文件中的classpath屬性中定義
  3. 可能程序的啓動腳本覆蓋了原來的classpath環境變量
  4. 由於NoClassDefFoundError是java.lang.LinkageError的一個子類,因此可能因爲程序依賴的原生的類庫不可用而致使
  5. 檢查日誌文件中是否有java.lang.ExceptionInInitializerError這樣的錯誤,NoClassDefFoundError有多是因爲靜態初始化失敗致使的(這是我遇到的問題的解決辦法)
  6. 若是你工做在J2EE的環境,有多個不一樣的類加載器,也可能致使NoClassDefFoundError。
  7. NoClassDefFoundError也可能因爲類的靜態初始化模塊錯誤致使,當你的類執行一些靜態初始化模塊操做,若是初始化模塊拋出異常,哪些依賴這個類的其餘類會拋出NoClassDefFoundError的錯誤。若是你查看程序日誌,會發現一些java.lang.ExceptionInInitializerError的錯誤日誌,ExceptionInInitializerError的錯誤會致使java.lang.NoClassDefFoundError: Could not initialize class
相關文章
相關標籤/搜索