将另一个类的数组数据从一个活动传输到另一个活动时出现空指针异常

问题描述 投票:0回答:1

我正在尝试通过“Intent.putExtra”将另一个类的数组数据从一个活动传输到另一个活动。我的目的是为测验活动使用相同的类,无论它是在一级还是二级,当用户选择一级或二级时,为不同的级别放置特定的数组,以防止我为每个级别创建如此多的单独的类.

class currentActivity : AppCompatActivity() {

button_levelOne.setOnClickListener{
            val nextPage = Intent(this, nextActivity::class.java)

            nextPage.putExtra("key_questions", backendDataQuestions().questionLevelOne)

            startActivity(nextPage)
            finish()
        }

button_levelTwo.setOnClickListener{
            val nextPage = Intent(this, nextActivity::class.java)

            nextPage.putExtra("key_questions", backendDataQuestions().questionLevelTwo)

            startActivity(nextPage)
            finish()
        }
}

class nextActivity : AppCompatActivity() {
    lateinit var array_questionContents: Array<String>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_game)

        //DOES NOT WORK!!!
        array_questionContents = getIntent().getSerializableExtra("key_questions") as Array<String>

}
class backendDataQuestions(){
val questionLevelOne = arrayOf(
        "Question 1",
        "Question 2",
        "Question 3"
    )

val questionLevelTwo = arrayOf(
        "Question 1",
        "Question 2",
        "Question 3"
   )
}

这会导致此错误消息:

“java.lang.RuntimeException:无法启动 Activity ComponentInfo{com.example.application/com.example.application.nextActivity}:java.lang.NullPointerException:null 无法转换为非 null 类型 kotlin.Array

我已经尝试过将

lateinit var array_questionContents: Array<String>
变成
Array<Any>
Array<*>
,但没有成功。

我之前已经让“nextActivity”类在需要时直接调用 backendDataQuestions 类的数组,并且工作得很好。

kotlin nullpointerexception
1个回答
0
投票

您面临的问题可能是由于您初始化 backendDataQuestions 类实例的方式所致。每次调用 backendDataQuestions() 时,您都会创建该类的一个新实例,这意味着您尝试在 nextActivity 中访问的数组与您在 Intent extras 中放入的数组不同。

要解决此问题,您应该创建 backendDataQuestions 的实例并将其存储在意图附加项中,而不是每次设置附加项时创建一个新实例。以下是修改代码的方法:

button_levelOne.setOnClickListener {
    val nextPage = Intent(this, nextActivity::class.java)
    val backendQuestions = backendDataQuestions()

    nextPage.putExtra("key_questions", backendQuestions.questionLevelOne)
    startActivity(nextPage)
    finish()
}

button_levelTwo.setOnClickListener {
    val nextPage = Intent(this, nextActivity::class.java)
    val backendQuestions = backendDataQuestions()

    nextPage.putExtra("key_questions", backendQuestions.questionLevelTwo)
    startActivity(nextPage)
    finish()
}

在你的下一个活动中:

class nextActivity : AppCompatActivity() {
    lateinit var array_questionContents: Array<String>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_game)

        array_questionContents = intent.getStringArrayExtra("key_questions") ?: emptyArray()
    }
}

通过仅创建 backendDataQuestions 的一个实例并使用该实例访问数组,您可以确保在将它们放入意图附加项中以及在下一个活动中检索它们时都引用相同的数组。

© www.soinside.com 2019 - 2024. All rights reserved.