繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM