Search code examples
androidkotlinnullpointerexception

java.lang.ExceptionInInitializerError -- Caused by: java.lang.NullPointerException


When starting the activity, this exception was thrown out, because of nullable context of the PhotoApp Application. I tried so many times, but I can't find where the problem is. If anyone can help, thank you...

PhotoApp call inside the fragment.

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) 

The exception is still throwing after too many edits, and i can't solve it.


Solution

  • Static members of the fragment (attributes inside the companion object) are available on app start, regardless of lifecycles.

    The var emojilist is therefore initialised before the application can set the photoApp variable. This leads to the NPE since you access photoApp before it is initialized. A quick fix could be to make the variable lazy, like so:

    private val emojisList by lazy { getEmojis(photoApp) } 
    

    This way the variable is initialised when it is first referenced. Provided that you reference the emojiList when the application has passed the onCreate lifecycle step. I would advise to put the variable outside of the companion object block as well, since a fragment should not be referenced by other parts of an android app.