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

上面提到的代碼適用於我,但修改爲循環如下所述導致NullPointerException當我嘗試訪問數組的元素。任何人都可以解釋它爲什麼會發生?增強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

一旦Java看到你已經做了增強的for循環,它會運行你放入它的任何內容,並創建一個新變量(稱爲d),並給這個變量賦予數組內任何值。當您設置d等於new Day(5);時,您正在更改變量d的值,而不是數組內的值。這裏是一個解決方法:

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

這伸入實際的陣列來設置值。希望這可以幫助!

0

第二類型的for使用Iterator用於通過元件迭代。初始化參考d沒有意義,因爲此操作不會更改數組中的引用。

1

循環變量增強for循環是暫時的。在循環體內賦值對原始項沒有影響。下面是根據Java語言規範會發生什麼變化循環:

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

當您指定d,它改變了局部變量d,不days[i],這isnearly總是出錯。出於這個原因,一些程序商店採用使增強for循環最後的循環變量的做法:

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

如果你想避免循環縮短代碼,使用

Arrays.setAll(days, i -> new Day(5));