0

我正在努力创建一个类本身的实例数组。

class A (arg: Int) {
    var a1 = new Array[A] (arg)
    ....
}

以这种方式声明它会在运行时给出“java.lang.NullPointerException”。有什么办法可以消除这个异常?

4

2 回答 2

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();   
}
于 2012-10-07T12:21:05.940 回答
0

这一切都归结为您希望通过此代码实现的目标:

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),创建一个空数组。

于 2012-10-07T12:36:08.670 回答