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

启动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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:02:02