kotlin uninitializedpropertyaccessexception

mu0hgdu0  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(1131)

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

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.
            }
        }

有人能帮我解决这个问题吗?我已经想了好几个小时了,所以任何帮助都会很感激的,谢谢!

bcs8qyzn

bcs8qyzn1#

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

object CurTuning {
    var curTuning : String? = null
 }

与我的其余代码一起工作(如果我用 CurTuning.curTuning 也就是说)
编辑:有人指出,这是多余的,我可以直接把curtuning到我的类,但这并不适用于我的情况。但是我注意到当使用一个伴随对象时,我不需要变量为空。

oprakyz7

oprakyz72#

使用lateinit时,在使用lateinit变量之前,有一个初始化lateinit变量的边界,否则会导致此异常。
异常kotlin.uninitializedpropertyaccessexception:lateinit property curtuning表示您试图在初始化curtuning变量之前访问它,因此引发了异常。
如果您不确定用什么初始化限幅,那么请将其设置为可为null的变量,但请确保使用适当的值对其进行更新和设置,并处理可为null的情况,否则将出现nullpointerexception

相关问题