2012-09-04 28 views
8

我會盡快解決問題。我有一個簡單的類for each loop無法初始化數組中的對象

class Vector{ 
    float x, y; 
} 

和其他類有這些對象作爲其成員的數組

Vector[] buffer; 

我初始化這樣的:

buffer = new Vector[8]; 
for(Vector v: buffer) 
    v = new Vector(); 

但是當我嘗試訪問這個對象的成員在這個數組中,我得到一個NullPointerException直接到我的堆棧跟蹤。也就是說,數組的對象還沒有被構建。在另一方面,這種比較傳統的代碼的工作只是完美:

buffer = new Vector[8]; 
for(int i = 0; i<8; i++) 
    buffer[i] = new Vector; 

由於this討論要點出來,都應該是編譯後相同。

我的問題是,爲什麼每個循環無法初始化/構造項目數組中的對象?

+0

如果您在for循環中使用buffer.length而不是重複8,那麼它對您的數組大小將始終是正確的。否則,如果你改變了一個8而不是另一個,那麼你會錯過結束元素或者獲得一個數組超出界限的異常。 – n00begon

+0

這只是爲了舉例。實際上,在for循環之前將buffer.length分配給變量並將其用於條件對於性能來說有點更好 - 幾乎可以忽略不計 - 這也是我的慣例。 – mehmetminanc

+0

那麼,甚至有一個關於確切的優化問題http://stackoverflow.com/questions/1208320/what-is-the-cost-of-calling-array-length – n00begon

回答

5

在您的for-each示例中,您將覆蓋未被保存回數組的循環的局部變量。它是你的第二個循環會類似於:

for(int i = 0; i < buffer.length; i++){ 
    Vector v = buffer[i]; 
    v = new Vector(); 
} 

退房Understanding for each loop in Java爲基本相同的問題。

5

這兩個循環都是相同的訪問元素從一個數組,但不是初始化它們。當你在這種情況下使用for-each循環,這就像做

for(int x = 0; x < array.length; x++) { 
    Vector v = array[x]; 
    v = new Vector(); 
} 

你沒有指定新Vector到陣列中,而不是你將其分配到一個局部變量。

2

在第一個示例中,v僅在for循環中可用。當你這樣做時v = new Vector(); v被更新,但沒有緩衝[i]。 v之前指向緩衝區[i],現在它指向一個新的矢量,buffer[i]仍然爲null