一個困擾很久的異常—java.lang.NoClassDefFoundError: com/google/gson/Gson


描述:

  這個異常是在運行時拋出的,編譯的時候沒有任何問題,而且異常信息非常少,只有一句:java.lang.NoClassDefFoundError: com/google/gson/Gson

解決:

  1、根據打印出的異常信息,最直觀的會認為gson包出了問題,然后找到去類路徑下找到gson包,沒有問題;

  2、第一步行不通,然后從NoClassDefFoundError入手,查閱相關資料,一般引起這個錯誤的原因大部分都是:

    1)需要實例化的類定義中的初始化部分(如類屬性定義、static 變量、static 塊等)的代碼很有可能拋出了異常

    2)接着注釋其中的 gson 部分代碼,再進行調試,發現沒有異常,錯誤原因找到了

  3)但是gson包必須在項目用到,不能修改,所以必須用另外的方案,谷歌了一下,發現解決方案很多

    1)首先嘗試的第一個解決方案是,新建一個lib目錄,把gson包放到lib目錄中,調試結果,仍然報錯

    2)繼續找第二個解決方案,新建一個classpath的Entry,然后把對應的gson的entry添加到classpath,調試結果仍然報錯

    3)嘗試着第三種解決方案,我把gson的版本降低,原項目使用的是2.3.1,我改成2.2.2,調試結果仍然報錯

  3)最后,在這個類的父類(子類和父類在不同的項目里面)中添加gson包,調試通過

總結:

  解決這個問題,主要從兩個方面入手可以很快解決:

  1、首先需要知道NoClassDefFoundError這個錯誤信息是因為什么引起的

    這個錯誤大部分情況是由:類定義中的初始化部分(如類屬性定義、static 變量、static 塊等)的代碼拋出異常引起的

  2、第二個需要知道的是,JVM的類加載順序,以及子類父類的加載順序和加載情況;

    1)加載類的時機:“類的代碼在初次使用時才加載”,一般就是在我們new實例、使用靜態域或者使用靜態方法的時候去加載class文件

    2)當我們new一個子類時,要去加載子類,可是在加載子類時,發現了extends關鍵字,說明有父類,那么先去加載父類,以此類推,一直加載到Object。

     所有相關類加載完之后,從根基類開始執行靜態變量、靜態代碼塊,然后是下一個導出類,以此類推。靜態方法在加載類的時候就會加載到內存靜態存儲區,無需構造類的實例就可以調用。

     至此,所有的類都已經加載完成,可以開始實例化了,實例化時,先從根基類的構造方法開始執行起,然后是下一個導出類,以此類推。在這個過程中,需要注意的是,雖然執行了父類的構造方法,

     但是沒有生成父類的對象,“執行構造方法是為生成對象初始化的,並不是生成對象”。其實,最終只new了一個子類對象出來。

  所以解決這個問題很簡單,就是直接在父類的項目中添加gson包。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM