[当我遇到NullPointerException
时,我只是在创建该应用程序以进行练习,但是我的代码才刚刚开始工作,我不知道为什么会这样。
我正在实现onSaveInstanceState
和onRestoreInstanceState
来改变方向,并且player
中第14行的SkillActivity.kt
变量停止工作,因此我的应用程序不断崩溃。这是SkillActivity.kt
中的代码:
package com.example.soosh.controller
import android.content.Intent
import android.os.Bundle
import android.os.PersistableBundle
import android.widget.Toast
import com.example.soosh.Model.Player
import com.example.soosh.R
import com.example.soosh.utlities.EXTRA_PLAYER
import kotlinx.android.synthetic.main.activity_skill.*
class SkillActivity : BaseActivity() {
var player = intent.getParcelableExtra<Player>(EXTRA_PLAYER)
override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle) {
super.onSaveInstanceState(outState, outPersistentState)
outState.putParcelable(EXTRA_PLAYER, player)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_skill)
finishBtn.setOnClickListener {
if (player?.category != "") {
val finished = Intent(this, FinishedActivity::class.java)
finished.putExtra(EXTRA_PLAYER, player)
startActivity(finished)
}
else {
val popup = Toast.makeText(this, "Please select a category to continue.", Toast.LENGTH_LONG)
popup.show()
}
}
beginnerButton.setOnClickListener {
ballerButton.isChecked = false
player?.category = "Beginner"
}
ballerButton.setOnClickListener {
beginnerButton.isChecked = false
player?.category = "Baller"
}
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
if (savedInstanceState != null) {
player = savedInstanceState.getParcelable(EXTRA_PLAYER)
}
}
}
logcat中的错误:
06-07 19:07:18.973 7773-7773/com.example.soosh E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.soosh, PID: 7773
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.soosh/com.example.soosh.controller.SkillActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Parcelable android.content.Intent.getParcelableExtra(java.lang.String)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3007)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3278)
at android.app.ActivityThread.access$1000(ActivityThread.java:211)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1705)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6918)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Parcelable android.content.Intent.getParcelableExtra(java.lang.String)' on a null object reference
at com.example.soosh.controller.SkillActivity.<init>(SkillActivity.kt:14)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.Class.newInstance(Class.java:1689)
at android.app.Instrumentation.newActivity(Instrumentation.java:1094)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2997)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3278)
at android.app.ActivityThread.access$1000(ActivityThread.java:211)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1705)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6918)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
非常感谢您的帮助。谢谢:)
仅在调用intent
后才必须访问onCreate
。您可以通过将其包装到lazy
委托中来解决此问题:
val player by lazy { intent.getParcelableExtra<Player>(EXTRA_PLAYER) }