我的不可为空的ArrayList在调用它并抛出Null指针异常时返回null

问题描述 投票:0回答:2

[使用JDK 14在IntelliJ IDEA 2020.11上运行并在Kotlin中对其进行编码。

我有一个带有变量menuComponents的类,该类是一个充满MenuComponents的ArrayList,但在初始化时为空。

var menuComponents: ArrayList<MenuComponent> = ArrayList()

我想编辑组件,所以我写了这个。

for (component in menuComponents) {
    //Do some stuff. The stuff doesn't matter, it throws an exception if I leave it blank
}

当我调用此方法时,出现空指针异常。此外,for循环甚至都没有关系。

class NPE() {

    init {
        refreshProperties()
    }

    var menuComponents: ArrayList<Double> = ArrayList()

    fun refreshProperties() {
        refreshJMenuComponents()
    }

    private fun refreshJMenuComponents() {
        val i = menuComponents.size
        println("$i is the length.")
        for (index in 0 until menuComponents.size) {
            val component = menuComponents[index]
            println("Refreshed component: $component")
        }
    }
}

fun main() {

    NPE()
}

此语句也出错。在调用这些组件之前,我根本不会更改menuComponents,因此它应该等于一个空白数组列表。我不知道为什么它会引发Null指针异常。

menuComponents = arrayListOf(//component 1, component 2)

如果现在尝试在menuComponents上运行任何先前的语句,它仍然会引发Null Pointer Exception。该值不可为空,我将其显式设置为等于某个值,那么为什么它会出错呢?如果某个地方有空对象,它甚至应该不编译?它会编译,然后引发异常。

这是某种可能的错误还是我只是想念一些东西?

kotlin arraylist nullpointerexception
2个回答
0
投票

我只需要将变量初始化移到init块上方。

class NPE() {

    var menuComponents: ArrayList<Double> = ArrayList()

    init {
        refreshProperties()
    }

    fun refreshProperties() {
        refreshJMenuComponents()
    }

    private fun refreshJMenuComponents() {
        val i = menuComponents.size
        println("$i is the length.")
        for (index in 0 until menuComponents.size) {
            val component = menuComponents[index]
            println("Refreshed component: $component")
        }
    }
}

fun main() {

    NPE()
}

0
投票
class NPE() {

var menuComponents: ArrayList<Double> = ArrayList()

init {
    refreshProperties()
}

fun refreshProperties() {
    refreshJMenuComponents()
}

private fun refreshJMenuComponents() {
    val i = menuComponents.size
    println("$i is the length.")
    for (index in 0 until menuComponents.size) {
        val component = menuComponents[index]
        println("Refreshed component: $component")
    }
}

}

fun main(){

NPE()

}

如果您只是将class变量的声明移到init之上,它将起作用

© www.soinside.com 2019 - 2024. All rights reserved.