[使用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。该值不可为空,我将其显式设置为等于某个值,那么为什么它会出错呢?如果某个地方有空对象,它甚至应该不编译?它会编译,然后引发异常。
这是某种可能的错误还是我只是想念一些东西?
我只需要将变量初始化移到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()
}
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之上,它将起作用