2017-04-16 123 views
1
protected Day[] days= new Day[n]; 
for(int i=0;i<days.length; i++) 
{ 
    days[i]= new Day(5); 
} 

上面提到的代码适用于我,但修改为循环如下所述导致NullPointerException当我尝试访问数组的元素。任何人都可以解释它为什么会发生?增强for循环无法初始化对象

protected Day[] days= new Day[n]; 
for(Day d:days) 
{ 
    d= new Day(5); 
} 
+0

你不能那样做。 'd'是单元格的内容。你不能分配给它;它只是一个副本。我不知道为什么它会导致NPE。 – Carcigenicate

+0

你可以指定它,它不会影响任何东西。 –

+1

我不明白你为什么会有NullPointerException。 @Oliver Charlesworth说,它应该不会改变循环中的“天”。你能显示堆栈跟踪吗? – davidxxx

回答

1

一旦Java看到你已经做了增强的for循环,它会运行你放入它的任何内容,并创建一个新变量(称为d),并给这个变量赋予数组内任何值。当您设置d等于new Day(5);时,您正在更改变量d的值,而不是数组内的值。这里是一个解决方法:

protected D[] days = new Day [n]; 
for(int i = 0;i<days.length;i++) 
    days[i] = new Day(5); 

这伸入实际的阵列来设置值。希望这可以帮助!

0

第二类型的for使用Iterator用于通过元件迭代。初始化参考d没有意义,因为此操作不会更改数组中的引用。

1

循环变量增强for循环是暂时的。在循环体内赋值对原始项没有影响。下面是根据Java语言规范会发生什么变化循环:

Day[] days = ... 
for (int i = 0; i < days.length; i++) { 
    Day d = days[i]; 
    ... 
} 

当您指定d,它改变了局部变量d,不days[i],这isnearly总是出错。出于这个原因,一些程序商店采用使增强for循环最后的循环变量的做法:

for(final Day d:days) { 
    d= new Day(5); // <<== Compile-time error 
} 

如果你想避免循环缩短代码,使用

Arrays.setAll(days, i -> new Day(5));