增强for循环无法初始化对象
问题描述:
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);
}
答
一旦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);
这伸入实际的阵列来设置值。希望这可以帮助!
答
第二类型的for
使用Iterator
用于通过元件迭代。初始化参考d
没有意义,因为此操作不会更改数组中的引用。
答
循环变量增强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));
你不能那样做。 'd'是单元格的内容。你不能分配给它;它只是一个副本。我不知道为什么它会导致NPE。 – Carcigenicate
你可以指定它,它不会影响任何东西。 –
我不明白你为什么会有NullPointerException。 @Oliver Charlesworth说,它应该不会改变循环中的“天”。你能显示堆栈跟踪吗? – davidxxx