2017-04-16 15 views
1
protected Day[] days= new Day[n]; 
for(int i=0;i<days.length; i++) 
{ 
    days[i]= new Day(5); 
} 

上記のコードはうまく動作しますが、配列の要素にアクセスしようとするとNullPointerExceptionが発生します。それはなぜ起こるのですか? for強化されたforループはオブジェクトを初期化できません

protected Day[] days= new Day[n]; 
for(Day d:days) 
{ 
    d= new Day(5); 
} 
+0

これはできません。 'd'はセルの内容です。あなたはそれに割り当てることはできません。それはちょうどコピーです。私はなぜそれがNPEを引き起こすのか分からない。 – Carcigenicate

+0

これに割り当てることができます。何も影響しません。 –

+1

NullPointerExceptionが発生する理由はわかりません。 @Oliver Charlesworthはこう述べている。スタックトレースを表示できますか? – davidxxx

答えて

1

を使用しますあなたが作成した拡張forループは、内部に置いたものを実行し、新しい変数(dと呼ばれます)を作り、この変数にあなたの配列の中にあるものの値を与えます。 dnew Day(5);に設定すると、配列内の値ではなく、変数dの値が変更されます。回避策を次に示します。

protected D[] days = new Day [n]; 
for(int i = 0;i<days.length;i++) 
    days[i] = new Day(5); 

これは値を設定するために実際の配列に到達します。お役に立てれば!

0

第二のタイプの要素によって反復ためIteratorを使用します。初期化参照dは、この操作では配列内の参照が変更されないため、意味がありません。

1

拡張ループ内のループ変数forループは一時的です。ループ本体内に割り当てることは元の項目には影響しません。ここではJava言語仕様に従ったループに何が起こるかです:あなたはdを割り当てる場合

Day[] days = ... 
for (int i = 0; i < days.length; i++) { 
    Day d = days[i]; 
    ... 
} 

は、それがローカル変数d、ないdays[i]、isnearly常にエラーを変更します。そのため、いくつかのプログラミングのお店は、最終的な強化forループのループ変数を作る練習を採用:

for(final Day d:days) { 
    d= new Day(5); // <<== Compile-time error 
} 

あなたはループを回避することにより、コードを短くしたい場合は、Javaが見たとき

Arrays.setAll(days, i -> new Day(5)); 
関連する問題