Java 尝试提取当前微调器项时Kotlin UninitializedPropertyAccessException

Java 尝试提取当前微调器项时Kotlin UninitializedPropertyAccessException,java,android,kotlin,exception,spinner,Java,Android,Kotlin,Exception,Spinner,我有两个微调器,第二个微调器根据第一个微调器的值更改它包含的项数组。我需要另一个类中第二个微调器的当前项(稍后我可能还需要另一个类中第一个微调器的当前项,但现在我只尝试获取第二个微调器),因此我尝试将其保存在变量中 我宣布 private lateinit var instrumentSpinner : Spinner private lateinit var tuningSpinner : Spinner internal lateinit var curTuning : String 以下

我有两个微调器,第二个微调器根据第一个微调器的值更改它包含的项数组。我需要另一个类中第二个微调器的当前项(稍后我可能还需要另一个类中第一个微调器的当前项,但现在我只尝试获取第二个微调器),因此我尝试将其保存在变量中

我宣布

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.
            }
        }
//初始化仪器微调器
仪表微调器=findViewById(R.id.instrument\U微调器)
ArrayAdapter.createFromResource(
这
R.array.instruments\u数组,
android.R.layout.simple\u微调器\u下拉菜单\u项
)。另外{适配器->
adapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项)
instrumentSpinner.adapter=适配器
}
instrumentSpinner.onItemSelectedListener=对象:onItemSelectedListener{
已选择“覆盖”选项(
家长:AdapterView,
视图:视图?,位置:Int,id:Long
) {
当(parent.getItemAtPosition(pos.toString()){
“吉他”->ArrayAdapter.createFromResource(
this@MainActivity,
R.array.tuning_array_吉他,
android.R.layout.simple\u微调器\u下拉菜单\u项
)。另外{适配器->
adapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项)
tuningSpinner.adapter=适配器
}
“Bass”->ArrayAdapter.createFromResource(
this@MainActivity,
R.array.tuning_array_bass,
android.R.layout.simple\u微调器\u下拉菜单\u项
)。另外{适配器->
adapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项)
tuningSpinner.adapter=适配器
}
“Ukulele”->ArrayAdapter.createFromResource(
this@MainActivity,
R.array.tuning_array_ukulele,
android.R.layout.simple\u微调器\u下拉菜单\u项
)。另外{适配器->
adapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项)
tuningSpinner.adapter=适配器
}
}
}
覆盖未选择的乐趣(家长:AdapterView?){
//什么也不做。
}
}
//初始化调谐微调器
tuningSpinner=findViewById(R.id.tuning_微调器)
ArrayAdapter.createFromResource(
这
R.array.tuning_array_吉他,
android.R.layout.simple\u微调器\u下拉菜单\u项
)。另外{适配器->
adapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项)
tuningSpinner.adapter=适配器
}
tuningSpinner.onItemSelectedListener=对象:onItemSelectedListener{
已选择“覆盖”选项(
家长:AdapterView,
视图:视图?,位置:Int,id:Long
) {
curTuning=tuningSpinner.getItemAtPosition(pos.toString())
}
覆盖未选择的乐趣(家长:AdapterView?){
//什么也不做。
}
}

有人能帮我解决这个问题吗?我已经花了好几个小时试图解决这个问题,所以任何帮助都将不胜感激,谢谢

当使用lateinit时,在使用lateinit变量之前,您有一个初始化该变量的边界,否则会出现此异常

异常kotlin.UninitializedPropertyAccessException:lateinit属性curTuning表示您试图在初始化变量之前访问该变量,因此引发了异常


如果您不确定使用什么来初始化curTuning,则将其设置为可为null的变量,但请确保更新并设置适当的值并处理可为null的属性,否则在使用lateinit时将出现NullPointerException

,在使用此异常之前,您有一个初始化lateinit变量的边界

异常kotlin.UninitializedPropertyAccessException:lateinit属性curTuning表示您试图在初始化变量之前访问该变量,因此引发了异常


如果您不确定使用什么来初始化限幅,则将其设置为可为空的变量,但是,请确保更新并将其设置为适当的值并处理可空性,否则将出现空点异常

使用空值分配
限幅
,而不是消除异常,但不能解决问题本身。但是像这样使用curTuning

 object CurTuning {
    var curTuning : String? = null
 }
与我的代码的其余部分一起使用(如果我使用
curTuning处理curTuning。curTuning
就是这样)


编辑:有人指出,这是多余的,我可以直接在我的类中设置curTuning,但这在我的情况下不起作用。但是我注意到,当使用伴生对象时,我不需要变量为null。

使用null赋值
curTuning
可以消除异常,但不能解决问题本身。怎么