You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中使用Dagger 2出现java.lang.ExceptionInInitializerError问题求助

解决Dagger 2中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:47:39