Hi!请登陆

排查butterknife10.1.0运行时空指针NullPointException

2020-10-17 69 10/17

港真,最近的butterknife10.1.0让在下吐了,各种问题很多,感觉这个插件已经慢慢的没人维护。好不容易编译成功,但是运行以后却出现可恶的空指针,还是一闪而过的那种。

com.xxx.Activity xxxx.method product NullPointException

类似的错误。

出现这种运行时空指针,无非就是没有赋值或者初始化,那么为何使用butterknife插件给view自动注入后,还会出现空指针呢?

首先,我们肯定在Gradle中配置了butterknife编译依赖,不然肯定会出现编译不通过的情况,更不用说会出现运行时空指针了,那么问题到底出现在哪里呢?

跟进经验,有以下两种情况会导致运行时空指针。

第一种:在setContentView之前设置butterknife.inject(this)方法

这个很好理解,因为还没有设置layout到环境里面,你的插件再怎么只能也不可能从一个空的环境中拿出实例然后自动化注入到View上面。

第二种,没有在该Module中配置butterknife依赖

也就是这两行依赖:

implementation 'com.jakewharton:butterknife:10.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'

第二种的原因分析

那么为何出现这个情况呢?那是因为在底层依赖的module配置了com.jakewharton:butterknife依赖以后编译就能通过,而且我们通常认为gradle能够传递依赖(现在我怀疑不会传递,只是传递了类上层包装的类而已)。

通过观察我们发现,哪怕是api 'com.android.support:appcompat-v7:28.0.0'这种也是每一个module的gradle.build都会存在一份,由此可见,当前gradle的编译依赖只对当前的module有效,不会传递gradle的各位依赖到上层的module中。日常中我们看到的一些依赖,其实是已经封装的一些底层类的上层引用(import xxx),和gradle依赖的直接类无关。

这方面还要继续学习Gradle的知识,才能更详尽的解答。

相关推荐