Android中使用Dagger 2出现java.lang.ExceptionInInitializerError问题求助
java.lang.ExceptionInInitializerError问题 我来帮你排查这个问题!你遇到的java.lang.ExceptionInInitializerError通常和静态成员初始化、代码生成异常或者组件生命周期顺序有关,结合你的代码来看,大概率是以下几个常见问题导致的,咱们一步步来解决:
1. 最容易忽略的坑:未注册自定义Application类
如果你的App类没有在AndroidManifest.xml中声明,系统会使用默认的Application实例,这就意味着你的App.onCreate()方法根本不会执行,静态的component变量会一直是null。后续调用App.getComponent().injector(this)时,就会触发异常(可能表现为ExceptionInInitializerError或者衍生的空指针异常)。
解决方案:
在AndroidManifest.xml的<application>标签中添加android:name=".App",指定自定义的Application类:
<application android:name=".App" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- 你的Activity声明 --> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
2. 静态component的初始化顺序问题
虽然Application.onCreate()是应用启动时最早执行的方法之一,但如果存在其他静态代码块、ContentProvider等组件在App.onCreate()之前执行,并且调用了App.getComponent(),就会导致component还未完成初始化,触发异常。
解决方案:
将静态component改为实例成员,通过Application实例获取组件,避免静态变量带来的初始化顺序问题:
修改App类:
public class App extends Application { private ApplicationComponent component; // 获取App实例的工具方法 public static App getInstance(Context context) { return (App) context.getApplicationContext(); } @Override public void onCreate() { super.onCreate(); component = DaggerApplicationComponent.builder() .picassoModule(new PicassoModule(this)) .build(); } public ApplicationComponent getComponent() { return component; } }
然后在MainActivity中调用:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 通过App实例获取组件 App.getInstance(this).getComponent().injector(this); setContentView(R.layout.activity_main); ButterKnife.bind(this); }
3. Dagger代码生成异常
有时候Dagger的注解处理器生成的代码会出现问题,导致静态初始化阶段出错。可以尝试以下步骤修复:
- 清理项目:执行
./gradlew clean(或者在Android Studio中点击Build -> Clean Project) - 重新构建项目:点击
Build -> Rebuild Project - 确认依赖配置正确:在Module级别的
build.gradle中确保添加了Dagger的依赖和注解处理器(替换为你使用的Dagger版本):
dependencies { // Dagger核心库 implementation 'com.google.dagger:dagger:2.44.2' // 注解处理器 annotationProcessor 'com.google.dagger:dagger-compiler:2.44.2' }
4. PicassoModule的上下文或初始化问题
如果Picasso的构建过程中出现异常(比如资源加载问题),也会导致Dagger初始化组件失败,进而触发ExceptionInInitializerError。可以先简化PicassoModule的提供方法,验证是否是Picasso的问题:
@Module public class PicassoModule { @Provides public Picasso picasso(){ // 先返回默认的Picasso实例 return Picasso.get(); } }
如果这样能正常运行,再逐步添加自定义的Builder配置,排查具体是哪一步出了问题。
内容的提问来源于stack exchange,提问作者Behzad Esfahani

