【发布时间】:2017-01-12 19:15:02
【问题描述】:
我一直在学习 java,想知道是否可以使用 foreach 循环构造数组内的对象。 使用 for 循环非常简单:
public class Bottle {
double waterAmount;
Bottle(){
waterAmount = 1.0;
}
public static void main(String[] args) {
Bottle[] bottles = new Bottle[3];
//foreach
for (Bottle bottle : bottles) {
bottle = new Bottle();
System.out.println(bottle.waterAmount);
}
//for
for (int i = 0; i<bottles.length;i++){
bottles[i] = new Bottle();
System.out.println(bottles[i].waterAmount);
}
System.out.println("index 1: " + bottles[1].waterAmount);
}
}
当我使用 for 循环运行这个程序时,我得到:
1.0
1.0
1.0
index 1: 1.0
这没关系,因为瓶子阵列已经正确构建。 当我只使用 foreach 执行它时,输出:
1.0
1.0
1.0
Exception in thread "main" java.lang.NullPointerException
at Bottle.main(Bottle.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
据我所知,foreach 中的瓶子构造了每个瓶子对象,但它并没有将这些新瓶子分配给数组的每个索引,所以这就是为什么我不能引用瓶子[1].waterAmount。
【问题讨论】:
-
你会感到惊讶,但答案就在这里stackoverflow.com/questions/40480/…
-
在 foreach 循环中更新局部变量
bottle绝不会修改初始化该变量的数组的内容。 -
@azurefrog 这正是我要问的。那么在这种情况下,有没有什么办法可以使用 foreach 循环来像 for 循环一样工作呢?
标签: java arrays for-loop foreach