运行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 通常发生在静态初始化块执行失败或静态变量初始化抛出异常时,结合代码重点排查以下几点:
检查静态变量初始化
确认AppConstants类中的db_name、db_version、dbTblNotification、dbTblNotificationStatus这些静态变量是否正确初始化。如果这些变量在静态块中赋值,检查静态块是否存在未捕获的异常。验证ApplicationContext有效性
确保ImdBulletinAndSatteliteImages.getAppContext()返回非空:- 检查自定义Application类是否在
AndroidManifest.xml的<application>标签中通过android:name正确配置; - 确认
getAppContext()方法在Application的onCreate()执行后才调用,避免应用初始化完成前获取上下文。
- 检查自定义Application类是否在
添加数据库操作异常捕获
静态方法中的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; } }优化静态方法设计
静态方法依赖数据库操作存在风险,建议改为非静态方法,或确保调用该方法前所有依赖资源(数据库、上下文)已完成初始化,避免在onCreateOptionsMenu这类生命周期早期方法中调用未准备好的静态资源。
内容的提问来源于stack exchange,提问作者Ashish Dake
相关产品推荐
相关产品推荐

