启动Activity抛出ExceptionInInitializerError,因PhotoApp上下文为空
问题:启动Activity时抛出ExceptionInInitializerError,根源是PhotoApp上下文为空
启动Activity时抛出如下异常:java.lang.ExceptionInInitializerError,其根源为java.lang.NullPointerException,经排查是PhotoApp Application的上下文为空导致,多次修改仍无法解决。
相关代码
Fragment中调用PhotoApp的代码
companion object { private var emojisList = getEmojis(photoApp) private fun getEmojis(context: Context?): ArrayList<String> { val convertedEmojiList = ArrayList<String>() val emojiList = context!!.resources.getStringArray(R.array.photo_editor_emoji) for (emojiUnicode in emojiList) { convertedEmojiList.add(convertEmoji(emojiUnicode)) } return convertedEmojiList }
PhotoApp Application代码
class PhotoApp : Application() { override fun onCreate() { super.onCreate() photoApp = this } companion object { var photoApp: PhotoApp?= null private set private val TAG = PhotoApp::class.java.simpleName } }
完整异常栈信息
FATAL EXCEPTION: main Process: com.eltoha.chatDate, PID: 26839 java.lang.ExceptionInInitializerError at com.eltoha.chatDate.photoEditor.EditImageActivity.onCreate(EditImageActivity.kt:93) at android.app.Activity.performCreate(Activity.java:8163) at android.app.Activity.performCreate(Activity.java:8130) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1330) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3744) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3938) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2291) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:210) at android.os.Looper.loop(Looper.java:299) at android.app.ActivityThread.main(ActivityThread.java:8319) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1038) Caused by: java.lang.NullPointerException at com.eltoha.chatDate.photoEditor.EmojiBSFragment$Companion.getEmojis(EmojiBSFragment.kt:102) at com.eltoha.chatDate.photoEditor.EmojiBSFragment.<clinit>(EmojiBSFragment.kt:92) at com.eltoha.chatDate.photoEditor.EditImageActivity.onCreate(EditImageActivity.kt:93) at android.app.Activity.performCreate(Activity.java:8163) at android.app.Activity.performCreate(Activity.java:8130) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1330) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3744) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3938) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2291) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:210) at android.os.Looper.loop(Looper.java:299) at android.app.ActivityThread.main(ActivityThread.java:8319) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1038)
问题原因
Fragment的companion object属于类级别静态成员,会在类第一次被加载时初始化。而Application的onCreate方法要在应用启动后才执行,这就导致初始化emojisList时,photoApp还未被赋值,依然为null,调用context!!.resources直接触发空指针异常。
解决办法
方案1:延迟初始化emojisList
将emojisList改为延迟初始化,直到第一次使用时再执行加载逻辑,此时PhotoApp.photoApp已经完成赋值:
companion object { private val emojisList by lazy { getEmojis(PhotoApp.photoApp) } private fun getEmojis(context: Context?): ArrayList<String> { val convertedEmojiList = ArrayList<String>() val emojiList = context!!.resources.getStringArray(R.array.photo_editor_emoji) for (emojiUnicode in emojiList) { convertedEmojiList.add(convertEmoji(emojiUnicode)) } return convertedEmojiList }
方案2:在Fragment生命周期中初始化数据
如果不需要静态持有emojisList,可将初始化逻辑移到Fragment的onAttach或onViewCreated方法中,此时Fragment已关联上下文,无需依赖Application静态实例:
private var emojisList: ArrayList<String>? = null override fun onAttach(context: Context) { super.onAttach(context) emojisList = getEmojis(context) } private fun getEmojis(context: Context): ArrayList<String> { val convertedEmojiList = ArrayList<String>() val emojiList = context.resources.getStringArray(R.array.photo_editor_emoji) for (emojiUnicode in emojiList) { convertedEmojiList.add(convertEmoji(emojiUnicode)) } return convertedEmojiList }
方案3:确认PhotoApp在Manifest中注册
先检查PhotoApp是否已在AndroidManifest.xml中正确注册,否则onCreate不会执行,photoApp始终为空:
<application android:name=".PhotoApp" <!-- 其他属性 --> > <!-- 活动等注册 --> </application>
内容的提问来源于stack exchange,提问作者Mahmoud Nabil
相关产品推荐
相关产品推荐

