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タイプの要素の配列が必要だと思います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 に答える