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.
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.