Scala - 我们如何创建同类的类实例?

时间:2012-10-07 11:57:45

标签: scala

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

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

以这种方式声明它会在运行时产生“java.lang.NullPointerException”。有没有办法删除这个例外?

2 个答案:

答案 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)]结束,创建一个空数组。