protected Day[] days= new Day[n];
for(int i=0;i<days.length; i++)
{
days[i]= new Day(5);
}
上面提到的代码对我来说很好,但是当我尝试访问数组的元素时,如下所述修改for循环会导致NullPointerException。任何人都可以解释为什么会发生这种情况?
protected Day[] days= new Day[n];
for(Day d:days)
{
d= new Day(5);
}
答案 0 :(得分:1)
增强型for
循环中的循环变量是临时的。在循环体内分配它对原始项目没有影响。以下是根据Java语言规范发生的循环:
Day[] days = ... for (int i = 0; i < days.length; i++) { Day d = days[i]; ... }
当您指定d
时,它会更改本地变量d
,而不是days[i]
,这通常是一个错误。出于这个原因,一些编程工作室采用了增强for
循环最终的循环变量的做法:
for(final Day d:days) {
d= new Day(5); // <<== Compile-time error
}
如果您想通过避免循环来缩短代码,请使用
Arrays.setAll(days, i -> new Day(5));
答案 1 :(得分: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);
这到达实际数组以设置值。希望这有帮助!
答案 2 :(得分:0)
第二种for
使用Iterator
进行元素迭代。初始化引用d
没有任何意义,因为此操作不会更改数组中的引用。