導入開源庫後,出現java.lang.NoClassDefFoundError: rx.plugins.RxJavaPlugins異常

前言

在最近的開發中,遇到較爲尷尬的異常,NoClassDefFoundError,但是我稱之它爲異常確實不太精確,他並不是一個傳統意義上的異常,與之類似的還有一個ClassNotFoundException,這兩個異常看起來確實十分相像,但是又大不相同,下面我就具體來說說一說這兩者的異同和解決方式

異同

  • NoClassDefFoundError:他並不是一個異常,他是一個錯誤,但是它卻沒有在編譯階段顯現出來,而是在運行階段出現,如果JVM或者ClassLoader實例嘗試加載(可以通過正常的方法調用,也可能是使用new來創建新的對象)類的時候卻找不到類的定義。要查找的類在編譯的時候是存在的,運行的時候卻找不到了。這個錯誤往往是你使用new操作符來創建一個新的對象但卻找不到該對象對應的類。這個時候就會導致NoClassDefFoundError.由於NoClassDefFoundError是有JVM引起的,所以不應該嘗試捕捉這個錯誤。解決這個問題的辦法就是:查找那些在開發期間存在於類路徑下但在運行期間卻不在類路徑下的類。
  • ClassNotFoundException:Java支持使用Class.forName方法來動態地加載類,任意一個類的類名如果被作爲參數傳遞給這個方法都將導致該類被加載到JVM內存中,如果這個類在類路徑中沒有被找到,那麼此時就會在運行時拋出ClassNotFoundException異常。

    要解決這個問題很容易,唯一需要做的就是要確保所需的類連同它依賴的包存在於類路徑中。當Class.forName被調用的時候,類加載器會查找類路徑中的類,如果找到了那麼這個類就會被成功加載,如果沒找到,那麼就會拋出ClassNotFountException,除了Class.forName,ClassLoader.loadClass、ClassLOader.findSystemClass在動態加載類到內存中的時候也可能會拋出這個異常。

    另外還有一個導致ClassNotFoundException的原因就是:當一個類已經某個類加載器加載到內存中了,此時另一個類加載器又嘗試着動態地從同一個包中加載這個類。

    由於類的動態加載在某種程度上是被開發者所控制的,所以他可以選擇catch這個異常然後採取相應的補救措施。有些程序可能希望忽略這個異常而採取其他方法。還有一些程序則會終止程序然後讓用戶再次嘗試前做點事情。

NoClassDefFoundError問題的原因是項目沒有初始化 MultiDex 選項要解決這個問題分位一下三個步驟,缺一不可
  • 步驟一: 在app文件夾下的 build.gradle文件指定位置添加
defaultConfig {
        applicationId "com.shuangk.majingze.demo"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
  • 步驟二 :在app文件夾下的 build.gradle文件中添加multidex 包依賴
    compile 'com.android.support:multidex:1.0.0'
  • 步驟三:將項目自定義的Application繼承MultiDexApplication,或者直接在自定義Application中重寫方法,代碼如下:
   @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

這樣就解決了

結尾

此問題主要是由ART程序引發的版本問題,有關Java.lang.NoClassDefFoundError的異常都可照此方法解決。

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