2014-02-17 64 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! 
} 
相关问题