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

运行Android应用时遭遇java.lang.ExceptionInInitializerError问题求助

Android应用中java.lang.ExceptionInInitializerError问题排查

报错信息

2024-07-01 12:19:28.157 AndroidRuntime           E  FATAL EXCEPTION: main
    Process: in.ashishdake.imdbulletinandsatelliteimages, PID: 28962
    java.lang.ExceptionInInitializerError
    at in.ashishdake.imdbulletinandsatelliteimages.Activities.HomeActivity.onCreateOptionsMenu(HomeActivity.java:108)
    at android.app.Activity.onCreatePanelMenu(Activity.java:4292)
    at androidx.activity.ComponentActivity.onCreatePanelMenu(ComponentActivity.java:520)
    at androidx.appcompat.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:95)
    at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.onCreatePanelMenu(AppCompatDelegateImpl.java:3429)
    at androidx.appcompat.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:458)
    at androidx.appcompat.app.ToolbarActionBar$1.run(ToolbarActionBar.java:58)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:264)

调用静态方法的代码位置

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.home, menu);

    try {
        if (AppConstants.unreadNotificationCount() > 0) {
            menu.findItem(R.id.actionNotifications).setIcon(R.drawable.ic_baseline_notifications_active_24);
        } else {
            menu.findItem(R.id.actionNotifications).setIcon(R.drawable.ic_baseline_notifications_24);
        }
    }
    catch (ExceptionInInitializerError e) {
        for(int i=0;i<e.getStackTrace().length;i++){
            Log.e("ExceptionInInitializer", e.getStackTrace()[i].toString());
        }
    }
    catch (Exception e) {
        Log.e("Error", e.toString());
    }

    return super.onCreateOptionsMenu(menu);
}

静态方法实现

public static int unreadNotificationCount() {
    DatabaseCreation dbCreation = new DatabaseCreation(ImdBulletinAndSatteliteImages.getAppContext(), db_name, null, db_version);
    SQLiteDatabase db = dbCreation.getWritableDatabase();

    String countQuery = "SELECT * FROM " + dbTblNotification + " WHERE " + dbTblNotificationStatus + "='0'";
    Cursor cursor = db.rawQuery(countQuery, null);
    int count = cursor.getCount();
    cursor.close();
    return count;
}

详细堆栈跟踪

2024-07-01 20:38:25.630 ExceptionInInitializer   E  in.ashishdake.imdbulletinandsatelliteimages.Utils.AppConstants.unreadNotificationCount(AppConstants.java:226)
2024-07-01 20:38:25.630 ExceptionInInitializer   E  in.ashishdake.imdbulletinandsatelliteimages.Activities.HomeActivity.onCreateOptionsMenu(HomeActivity.java:110)
2024-07-01 20:38:25.630 ExceptionInInitializer   E  android.app.Activity.onCreatePanelMenu(Activity.java:4292)
2024-07-01 20:38:25.630 ExceptionInInitializer   E  androidx.activity.ComponentActivity.onCreatePanelMenu(ComponentActivity.java:520)
2024-07-01 20:38:25.630 ExceptionInInitializer   E  androidx.appcompat.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:95)
2024-07-01 20:38:25.630 ExceptionInInitializer   E  androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.onCreatePanelMenu(AppCompatDelegateImpl.java:3429)
2024-07-01 20:38:25.630 ExceptionInInitializer   E  androidx.appcompat.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:458)
2024-07-01 20:38:25.630 ExceptionInInitializer   E  androidx.appcompat.app.ToolbarActionBar$1.run(ToolbarActionBar.java:58)
2024-07-01 20:38:25.631 ExceptionInInitializer   E  android.os.Handler.handleCallback(Handler.java:938)
2024-07-01 20:38:25.631 ExceptionInInitializer   E  android.os.Handler.dispatchMessage(Handler.java:99)
2024-07-01 20:38:25.631 ExceptionInInitializer   E  android.os.Looper.loop(Looper.java:264)
2024-07-01 20:38:25.631 ExceptionInInitializer   E  android.app.ActivityThread.main(ActivityThread.java:8315)
2024-07-01 20:38:25.631 ExceptionInInitializer   E  java.lang.reflect.Method.invoke(Native Method)
2024-07-01 20:38:25.631 ExceptionInInitializer   E  com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
2024-07-01 20:38:25.631 ExceptionInInitializer   E  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)

问题分析与解决建议

ExceptionInInitializerError 通常发生在静态初始化块执行失败或静态变量初始化抛出异常时,结合代码重点排查以下几点:

  1. 检查静态变量初始化
    确认AppConstants类中的db_name、db_version、dbTblNotification、dbTblNotificationStatus这些静态变量是否正确初始化。如果这些变量在静态块中赋值,检查静态块是否存在未捕获的异常。

  2. 验证ApplicationContext有效性
    确保ImdBulletinAndSatteliteImages.getAppContext()返回非空:

    • 检查自定义Application类是否在AndroidManifest.xml的<application>标签中通过android:name正确配置;
    • 确认getAppContext()方法在Application的onCreate()执行后才调用,避免应用初始化完成前获取上下文。
  3. 添加数据库操作异常捕获
    静态方法中的SQLite操作可能抛出异常(如数据库未创建、表不存在),这些异常会触发ExceptionInInitializerError。修改方法添加捕获逻辑:

    public static int unreadNotificationCount() {
        try {
            DatabaseCreation dbCreation = new DatabaseCreation(ImdBulletinAndSatteliteImages.getAppContext(), db_name, null, db_version);
            SQLiteDatabase db = dbCreation.getWritableDatabase();
    
            String countQuery = "SELECT * FROM " + dbTblNotification + " WHERE " + dbTblNotificationStatus + "='0'";
            Cursor cursor = db.rawQuery(countQuery, null);
            int count = cursor.getCount();
            cursor.close();
            return count;
        } catch (Exception e) {
            Log.e("DB_ERROR", "查询未读通知失败", e);
            return 0;
        }
    }
    
  4. 优化静态方法设计
    静态方法依赖数据库操作存在风险,建议改为非静态方法,或确保调用该方法前所有依赖资源(数据库、上下文)已完成初始化,避免在onCreateOptionsMenu这类生命周期早期方法中调用未准备好的静态资源。

内容的提问来源于stack exchange,提问作者Ashish Dake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:54:57