我正在努力创建一个类的实例数组。
class A (arg: Int) {
var a1 = new Array[A] (arg)
....
}
以这种方式声明它会在运行时产生“java.lang.NullPointerException”。有没有办法删除这个例外?
答案 0 :(得分:1)
我确定您稍后在代码中尝试访问数组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();
}
答案 1 :(得分:0)
这一切都归结为您希望通过此代码实现的目标:
var a1 = new Array[A] (arg)
我想你想要一个类型为arg
的{{1}}元素数组,但这些元素应该是什么?默认情况下,它们是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)]
结束,创建一个空数组。