クラス自体のインスタンスの配列を作成するために取り組んでいます。
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
タイプの要素の配列が必要だと思います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)
空の配列を作成する再帰が終了します。