描述:
這個異常是在運行時拋出的,編譯的時候沒有任何問題,而且異常信息非常少,只有一句: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包。