Java 无法初始化对象的增强for循环
第二种类型的Java 无法初始化对象的增强for循环,java,for-loop,Java,For Loop,第二种类型的for使用Iterator按元素进行迭代。初始化引用d没有意义,因为此操作不会更改数组中的引用。增强型for循环中的循环变量是临时的。在循环体中指定它对原始项没有影响。以下是根据Java语言规范对循环的影响: 如果希望通过避免循环来缩短代码,请使用 for(final Day d:days) { d= new Day(5); // <<== Compile-time error } 当Java看到您创建的增强for循环时,它将运行您放入其中的任何内容,并生成一个
for
使用Iterator
按元素进行迭代。初始化引用d
没有意义,因为此操作不会更改数组中的引用。增强型for
循环中的循环变量是临时的。在循环体中指定它对原始项没有影响。以下是根据Java语言规范对循环的影响:
如果希望通过避免循环来缩短代码,请使用
for(final Day d:days) {
d= new Day(5); // <<== Compile-time error
}
当Java看到您创建的增强for循环时,它将运行您放入其中的任何内容,并生成一个新变量(称为
d
),并为该变量提供数组中任何内容的值。将d
设置为新的一天(5)您正在更改变量d
的值,而不是数组中的值。以下是一个解决方法:
Arrays.setAll(days, i -> new Day(5));
protectedd[]天=新的一天[n];
对于(int i=0;i您不能这样做。d
是单元格的内容。您不能分配给它;它只是一个副本。但我不知道为什么它会导致NPE。您可以分配给它,它不会影响任何事情。我不明白您为什么会有NullPointerException。它在循环中作为@Oliver Charlesworth在天不应该做任何更改说。你能显示stacktrace吗?@davidxxx当他们试图在他们认为实际上在数组中的对象上运行时,可能出现了NullPointerException。@Yorickis可能是最好的。但在这种情况下,这对我们来说不是一个可复制的问题。
Day[] days = ...
for (int i = 0; i < days.length; i++) {
Day d = days[i];
...
}
for(final Day d:days) {
d= new Day(5); // <<== Compile-time error
}
Arrays.setAll(days, i -> new Day(5));
protected D[] days = new Day [n];
for(int i = 0;i<days.length;i++)
days[i] = new Day(5);