启动活动时,由于 PhotoApp 应用程序的可为空上下文,此异常被抛出。 试了很多次,就是找不到问题出在哪里。 如果有人能帮忙,谢谢...
片段内的 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 应用程序
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)
编辑太多还是抛出异常,无法解决
片段的静态成员(伴随对象内的属性)在应用程序启动时可用,与生命周期无关。
var emojilist 在应用程序可以设置 photoApp 变量之前被初始化。这会导致 NPE,因为您在 photoApp 初始化之前访问它。一个快速的解决办法是让变量变得惰性,就像这样:
private val emojisList by lazy { getEmojis(photoApp) }
这样变量在第一次被引用时被初始化。前提是您在应用程序已通过 onCreate 生命周期步骤时引用 emojiList。我建议也将变量放在伴随对象块之外,因为片段不应被 Android 应用程序的其他部分引用。