增强的for循环无法初始化对象

时间:2017-04-16 12:20:41

标签: java for-loop

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);
}

3 个答案:

答案 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没有任何意义,因为此操作不会更改数组中的引用。