2014-02-17 143 views
0

我有一個簡短的問題,告訴我爲什麼第一個例子不工作,第二個工作。實例前 代碼:特定的NullPointerException異常Java

Tiles[] myTiles = new Tile[23]; 
number = 1; 

第一示例:

for(Tile tile : this.myTiles) { 
    if (number != this.myTiles.length) { 
     tile = new Tile(number, getResources().getColor(R.color.puzzle_default)); 
     number++; 
    } 
} 

第二示例:

for(Tile tile : this.myTiles) { 
    if (number != this.myTiles.length){ 
     this.myTiles[number-1] = new Tile(number, getResources().getColor(R.color.puzzle_default)); 
     number++; 
    } 
} 

如果我在其他方法中類使用以下代碼

this.myTiles[0].getNumber(); 

這是NullPointerE xception。
但與第二個例子很好地工作。

我真的不知道爲什麼。感謝您的任何響應

+3

因爲你的第一個for循環不修改數組中的對象。 – user2336315

+0

第一個例子中的tile不參考我的數組中的對象嗎? – user2899587

+0

'myTiles'是什麼類型 –

回答

1

第一環路使得每個對象的副本,並且等同於

for (int i=0; i < myTiles.length; i++) { 
    Tile tile; 
    ... 
    tile = new Tile(...); // set local reference only 
} 

作爲對象數組元素是null默認這些將保持未分配的循環的範圍之外。該myTiles的原始元素保留默認null

+0

爲什麼它只是複製,tile是數組myTiles中的對象的參照。 – user2899587

+0

增強型for循環創建一個未分配給任何數組元素的本地參考 – Reimeus

+0

噢,我明白了,謝謝,今天我只有一個糟糕的一天 – user2899587

1

的每個循環使用的Iterator內部從集合獲取項目,並返回一個新的參考包含每個元素的局部變量 - 改寫該基準是完全無用的,因爲它只對一個for循環有效,並將在下一個替換。

「內部」,你的第一個循環將轉化

for (Iterator<Tile> iterator = myTiles.iterator(); iterator.hasNext;){ 
    Tile tile = iterator.next(); 
    tile = new Tile(number, getResources().getColor(R.color.puzzle_default)); 
    number++; 
} 
0

在Java中,有作爲直接操作的指針沒有這樣的事情。每當你得到一個對象的引用時,你都會得到一個引用的副本,就像一個指向指針的指針。出於這個原因,如果你這樣做:

String s = "hello"; 
modify(s); 
System.out.println(s); // still hello! 

void modify(String s){ 
    s = s + " world"; 
} 

你不能真正改變原有的參考s由於功能操縱複製到該參考。在上面的例子中,你需要這樣的東西:

String s = "hello"; 
s = modify(s); 
System.out.println(s); // prints 'hello world' 

String modify(String s){ 
    return s + " world"; 
} 

同樣的情況發生在你的理解。變量tile被綁定到循環,並且是數組中引用的副本。原始引用(給定位置處的數組)不能直接以這種方式更改。這就是爲什麼你需要直接打電話:

myTiles[i] = // something 

閱讀this article欲瞭解更多信息。

所以修改Java中的數組的慣用方式是這樣的:

for(int i = 0; i < myTiles.length; i++){ 
    myTiles[i] = new Tile(...); // directly reassigning the reference in the array! 
} 
相關問題