Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
特定的NullPointerException Java_Java_Object_Nullpointerexception - Fatal编程技术网

特定的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循环创建了一个未分配给任何数组元素的本地引用