这个异常出现的原因就是没找到对应的类。

出现的场景:
  • app-> a.jar -> b.jar :比如 App 里面调用了 a.jar 的东西,然后 a.jar 里面又调用了 b.jar的东西。在 android studio 里面, 都是通过 gradle 的 implemetation ‘xxx’ 的方式引入的。
    这时候就会发生 NoClassDefFoundError 的异常。
    (这个问题解决方案就是 在 App里面也去引用一下 b.jar. @ 考虑到编译打包优化的问题,可能会把不使用的类不打包进apk,最好主动触发一下 b.jar 里面的类加载。比如new 一个对象,调用一个静态方法之类的

  • 使用一些 动态jar包,通过 gradle compileOnly 的方式引入,但是实际上对应的 jar不存在,这时候也会发生该异常。

  • 待补充…

临界点:

只要出现上面说的 app -> a.jar -> b.jar 就会发生这种异常吗?
不是的,必须是 app 里面通过 a.jar 调用了 b.jar 里面的类了才会发生异常。

举个例子: 假设依赖 jar 里面有个类叫做 Fake (Fake.java) ,然后你在 App 里面的自己的类里面 定义了有个变量 Fake ff = null; 这时候并不会出现这个异常。但是,如果你是创建这个类的对象,或者调用了里面的静态方法就会出现这个异常了。比如你写了 Fake ff = new Fake(...); , 或者是 Fake.callStaticFunc(...); 无论是哪一种。甚至是 int state = Fake.DEFAULT_INT; 这样都不行。 因为无论是创建对象还是调用类方法,调用类成员,都会触发类加载。 而这个异常就是类加载不到的时候会出现的。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐