lateinit 属性尚未初始化我找不到初始化它的方法

Пав*_*кий 1 android kotlin

我的 Kotlin 活动中有 lateinit 属性,这是它的简化版本:

class CreateNewListOfQuestions : AppCompatActivity() {
    lateinit var questionAnswerListOfObjects: ArrayList<QuestionAnswerObject>
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_create_new_list_of_questions)

        save.setOnClickListener {
            questionAnswerListOfObjects.add(0, QuestionAnswerObject("question", "answer", 1))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

主要问题是当我生成移动应用程序并按“保存”按钮时,应用程序停止工作。Logcat 显示此错误:“lateinit 属性 questionAnswerListOfObjects 尚未初始化”

我尝试了很多方法来初始化它,但这些方法对我没有帮助。我应该如何正确初始化它?我想将这个类的许多对象添加到 ArrayList 中:

class QuestionAnswerObject(var question: String, var answer: String, var probability: Int=100) {}
Run Code Online (Sandbox Code Playgroud)

And*_*lov 6

这取决于你想要什么。

例如,如果您需要的一切都在使用,ArrayList<QuestionAnswerObject>lateinit根本不需要:

var questionAnswerListOfObjects = ArrayList<QuestionAnswerObject>()
Run Code Online (Sandbox Code Playgroud)

就足够了

如果您想Bundle从其他东西中获取或从其他东西中获取 - 您必须使用前对其进行初始化。

基本上lateinit关键字仅用于说“嘿,编译器,我有一个变量,它尚未初始化,但我保证它会在我使用之前进行初始化,因此请将其标记为不可为空的字段”。

因此,如果您真的想使用lateinit,只需提前初始化该属性,例如在后面添加setContentView

questionAnswerListOfObjects = ArrayList<QuestionAnswerObject>()
Run Code Online (Sandbox Code Playgroud)