导入开源库后,出现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的异常都可照此方法解决。

你可能感兴趣的:(android)