[英]Kotlin UninitializedPropertyAccessException when trying to extract current spinner item
我有两个微调器,第二个微调器根据第一个的值更改它包含的项目数组。 我需要另一个班级中第二个微调器的当前项目(稍后我可能还需要另一个班级中第一个微调器的当前项目,但现在我只想获得第二个),所以我试图将其保存在变量中。
我全局声明
private lateinit var instrumentSpinner : Spinner
private lateinit var tuningSpinner : Spinner
internal lateinit var curTuning : String
这是日志猫:
kotlin.UninitializedPropertyAccessException: lateinit property curTuning has not been initialized
at com.example.tuner.MainActivity.getCurTuning$app_debug(MainActivity.kt:31)
at com.example.tuner.PitchProcessing.tuneGuitar(PitchProcessing.kt:16)
at com.example.tuner.MainActivity$onCreate$pdh$1$1.run(MainActivity.kt:130)
at android.os.Handler.handleCallback(Unknown Source:2)
at android.os.Handler.dispatchMessage(Unknown Source:4)
at android.os.Looper.loop(Unknown Source:208)
at android.app.ActivityThread.main(Unknown Source:107)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(Unknown Source:11)
at com.android.internal.os.ZygoteInit.main(Unknown Source:274)
第 31 行是该变量 (curTuning) 的声明,PitchProcessing 中的第 16 行尝试将该变量与MainActivity().curTuning
一起使用,在第 130 行我调用 PitchProcessing。
这是我的 onCreate 中的两个微调器:
// initializing instrument spinner
instrumentSpinner = findViewById(R.id.instrument_spinner)
ArrayAdapter.createFromResource(
this,
R.array.instruments_array,
android.R.layout.simple_spinner_dropdown_item
).also { adapter ->
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
instrumentSpinner.adapter = adapter
}
instrumentSpinner.onItemSelectedListener = object : OnItemSelectedListener {
override fun onItemSelected(
parent: AdapterView<*>,
view: View?, pos: Int, id: Long
) {
when (parent.getItemAtPosition(pos).toString()) {
"Guitar" -> ArrayAdapter.createFromResource(
this@MainActivity,
R.array.tuning_array_guitar,
android.R.layout.simple_spinner_dropdown_item
).also { adapter ->
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
tuningSpinner.adapter = adapter
}
"Bass" -> ArrayAdapter.createFromResource(
this@MainActivity,
R.array.tuning_array_bass,
android.R.layout.simple_spinner_dropdown_item
).also { adapter ->
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
tuningSpinner.adapter = adapter
}
"Ukulele" -> ArrayAdapter.createFromResource(
this@MainActivity,
R.array.tuning_array_ukulele,
android.R.layout.simple_spinner_dropdown_item
).also { adapter ->
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
tuningSpinner.adapter = adapter
}
}
}
override fun onNothingSelected(parent: AdapterView<*>?) {
// Do nothing.
}
}
// initializing tuning spinner
tuningSpinner = findViewById(R.id.tuning_spinner)
ArrayAdapter.createFromResource(
this,
R.array.tuning_array_guitar,
android.R.layout.simple_spinner_dropdown_item
).also { adapter ->
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
tuningSpinner.adapter = adapter
}
tuningSpinner.onItemSelectedListener = object : OnItemSelectedListener {
override fun onItemSelected(
parent: AdapterView<*>,
view: View?, pos: Int, id: Long
) {
curTuning = tuningSpinner.getItemAtPosition(pos).toString()
}
override fun onNothingSelected(parent: AdapterView<*>?) {
// Do nothing.
}
}
有人可以帮我解决这个问题吗? 我试图弄清楚它现在已经有好几个小时了,所以任何帮助将不胜感激,谢谢!
使用lateinit 时,您必须在使用它之前初始化lateinit 变量,否则会出现此异常。
异常kotlin.UninitializedPropertyAccessException: lateinit property curTuning表示您在初始化之前尝试访问curTuning变量,因此已抛出异常。
如果您不确定用什么来初始化curTuning ,则将其设为可空变量,但请确保更新并使用适当的值设置它并处理可空性,否则将出现NullPointerException
用 null 分配curTuning
反而摆脱了异常,但并没有解决问题本身。 但是像这样使用curTuning
object CurTuning {
var curTuning : String? = null
}
与我的其余代码一起使用(如果我使用 CurTuning.curTuning 解决CurTuning.curTuning
就是这样)
编辑:有人指出这是多余的,我可以直接将 curTuning 放入我的类中,但这在我的情况下不起作用。 但是我注意到在使用伴随对象时,我不需要变量可以为空。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.