1. 程式人生 > 其它 >NoClassDefFoundError: Could not initialize class

NoClassDefFoundError: Could not initialize class

介紹

NoClassDefFoundError 是由於 JVM 或 ClassLoader 例項為了呼叫某個類的方法或 new 類的新的例項,而試圖載入該類的定義時,卻無法找到其定義,而丟擲的異常。需要注意,對於丟擲該異常的情況,試圖找到的類的定義在編譯時存在,只是在執行時不知所蹤。

NoClassDefFoundError 總的來講有兩種情況,類檔案不存在,或是類初始化錯誤。它們的錯誤資訊不同。

java.lang.NoClassDefFoundError: com/example/Foo

原因:無法找到類檔案

NoClassDefFoundError: Could not initialize class {類名}

原因:類檔案初始化錯誤

ps:執行時載入類,執行static塊、給static變數初始化等

執行時載入:aop裡面,除了我們常用的那種執行時織入(spring aop),還有另外兩種方式,一種是編譯器織入,即編譯好的class已經是織入了切面後的class,再一種就是ltw(load time weaving),也叫類載入期織入。

這種織入就是在類首次被載入的時候,對該類的class位元組碼進行切面織入,從而實現aop功能。

參考:https://blog.csdn.net/deniro_li/article/details/82018648

通常由類的靜態成員或靜態初始化語句塊引起。諸如 private static final MyClass val = new MyClass();

或直接執行於 static {} 程式碼塊中的語句丟擲異常,都可能會引發 NoClassDefFoundError。針對第二種這種情況,可以在類的 static initializer 中增加 try catch 語句來捕獲異常並輸出日誌,來了解具體錯誤內容。

注意事項:NoClassDefFoundError繼承自Error,catch Exception無法捕獲,需要catch Throwable,因為Error和Exception均繼承自Throwable。catch Throwable後若無法處理,重新throw e或者throw new RuntimeException(IOException必須catch處理)即可。

ClassNotFoundException(未完待續。。。)

此外還有一種相似但不同的錯誤,ClassNotFoundException。它通常由 Java 執行時在無法找到僅在執行過程中才需要載入的類時丟擲。