我正在努力创建一个类本身的实例数组。
class A (arg: Int) {
var a1 = new Array[A] (arg)
....
}
以这种方式声明它会在运行时给出“java.lang.NullPointerException”。有什么办法可以消除这个异常?
我正在努力创建一个类本身的实例数组。
class A (arg: Int) {
var a1 = new Array[A] (arg)
....
}
以这种方式声明它会在运行时给出“java.lang.NullPointerException”。有什么办法可以消除这个异常?
我确定您稍后会在代码中尝试访问数组 a1 的元素。在那里你得到你的例外。
我准备了一小段代码来演示它:
class A (arg: Int) {
var a1=new Array[A] (arg)
def giveMeException(){
println(a1(0).a1.length)
}
}
object Program extends App {
val noExceptionA = new A(2);
noExceptionA.a1(0) = new A(0);
noExceptionA.a1(1) = new A(0);
val exceptionA = new A(2);
// Will print 0
noExceptionA.giveMeException();
// Will throw java.lang.NullPointerException
exceptionA.giveMeException();
}
这一切都归结为您希望通过此代码实现的目标:
var a1 = new Array[A] (arg)
arg
我猜你想要一个type 元素的数组A
,但是这些元素应该是什么?默认情况下它们是null
(或0
用于原始类型)。稍后你访问这个数组(例如a1(0)
,显然你得到NullPointerException
.
所以你应该在创建后填充数组。这是第一种方法:
class A (arg: Int) {
var al = Array.fill(arg)(new A(arg)) //WRONG!
}
请注意,Array.fill(3)("Foo")
结果是["Foo", "Foo", "Foo"]
数组。你看到这里的问题了吗?创建时new A(arg)
,您正在递归调用new A(arg)
. 循环永远不会结束。同样,我不知道您想要实现什么,所以这是一个有效的正确示例:
class A (arg: Int) {
var al = Array.fill(arg)(new A(arg - 1))
}
调用new A(3)
将创建一个数组[A(2), A(2), A(2)]
。轮流每次调用A(2)
都会创建[A(1), A(1)]
. 递归结束new A(0)
,创建一个空数组。