特定的NullPointerException Java
我有一个简短的问题,告诉我为什么第一个例子不起作用,第二个起作用。 示例之前的代码:特定的NullPointerException Java,java,object,nullpointerexception,Java,Object,Nullpointerexception,我有一个简短的问题,告诉我为什么第一个例子不起作用,第二个起作用。 示例之前的代码: 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));
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();
这是NullPointerException。但在第二个例子中,它很好地工作
我真的不知道为什么。感谢您的回复第一个循环复制每个对象,相当于
for (int i=0; i < myTiles.length; i++) {
Tile tile;
...
tile = new Tile(...); // set local reference only
}
for(int i=0;i
由于对象数组中的元素默认为
null
,因此这些元素在循环范围之外将保持未分配状态。myTiles
的原始元素保持其默认值null
值for-each循环在内部使用迭代器
从集合中提取项目,并返回对包含每个元素的局部变量的新引用-覆盖此引用完全无用,因为它只对一个for循环有效,并且将在下一个for循环中被替换
“内部”,您的第一个循环将转换为
for (Iterator<Tile> iterator = myTiles.iterator(); iterator.hasNext;){
Tile tile = iterator.next();
tile = new Tile(number, getResources().getColor(R.color.puzzle_default));
number++;
}
for(Iterator Iterator=myTiles.Iterator();Iterator.hasNext;){
Tile Tile=iterator.next();
tile=new tile(编号,getResources().getColor(R.color.puzzle_默认值));
数字++;
}
在Java中,没有直接操作指针的事情。任何时候当你得到一个对象的引用时,你就得到了一个引用的副本,就像指向指针的指针一样。因此,如果您执行以下操作:
String s = "hello";
modify(s);
System.out.println(s); // still hello!
void modify(String s){
s = s + " world";
}
for(int i = 0; i < myTiles.length; i++){
myTiles[i] = new Tile(...); // directly reassigning the reference in the array!
}
您实际上无法更改原始引用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
阅读了解更多信息
因此,在java中修改数组的惯用方法如下:
String s = "hello";
modify(s);
System.out.println(s); // still hello!
void modify(String s){
s = s + " world";
}
for(int i = 0; i < myTiles.length; i++){
myTiles[i] = new Tile(...); // directly reassigning the reference in the array!
}
for(int i=0;i
因为您的第一个for循环没有修改数组中的对象。第一个示例中的tile不是对我的数组中的对象的引用?什么类型是myTiles
@user2899587否。请参见:第二个循环中的数字的预定义值是什么?为什么它只是一个副本,平铺是对数组myTiles中对象的引用。增强的for循环创建了一个未分配给任何数组元素的本地引用