我有两个微调器,第二个微调器根据第一个微调器的值更改它包含的项的数组。我需要另一个类中第二个微调器的当前项(稍后我可能还需要另一个类中第一个微调器的当前项,但目前我只尝试获取第二个微调器),因此我尝试将其保存在变量中。
我宣布
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.
}
}
有人能帮我解决这个问题吗?我已经想了好几个小时了,所以任何帮助都会很感激的,谢谢!
2条答案
按热度按时间bcs8qyzn1#
分配
curTuning
而使用null则消除了异常,但不能解决问题本身。但是像这样使用限幅与我的其余代码一起工作(如果我用
CurTuning.curTuning
也就是说)编辑:有人指出,这是多余的,我可以直接把curtuning到我的类,但这并不适用于我的情况。但是我注意到当使用一个伴随对象时,我不需要变量为空。
oprakyz72#
使用lateinit时,在使用lateinit变量之前,有一个初始化lateinit变量的边界,否则会导致此异常。
异常kotlin.uninitializedpropertyaccessexception:lateinit property curtuning表示您试图在初始化curtuning变量之前访问它,因此引发了异常。
如果您不确定用什么初始化限幅,那么请将其设置为可为null的变量,但请确保使用适当的值对其进行更新和设置,并处理可为null的情况,否则将出现nullpointerexception