为什么每个循环都不起作用?

时间:2014-01-11 16:46:09

标签: java loops for-loop foreach

我有这个代码不起作用:

Panel[] panelArr = new Panel[5];

for (Panel p:panelArr) {
    p = new Panel();
}
Label lblName = new Label("Name:");
panelArr[0].add(lblName);

它出现了错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at GUIVehicles$NewSportsCarDialog.<init>(GUIVehicles.java:65)

但是如果我用for循环替换for-each循环就行了。

for (int i = 0; i < 5; i++) {
    panelArr[i] = new Panel();
}

据我所知,为每个循环查看文档,两个for循环应该是等效的。显然情况并非如此,我想知道为什么?

3 个答案:

答案 0 :(得分:7)

你的每一个都与此类似:

for (int i = 0; i < 5; i++) {
    Panel p = panelArr[i];
    p = new Panel();
}

因此,对p的分配显然对数组本身没有影响 - 您只是将 p 重定向到其他地方,这与阵列。因此,在for-each循环结束时,所有数组元素仍为null。你的第二个片段是填充数组的合适方式。

答案 1 :(得分:0)

由于p是一个局部变量,因此它不是panelArr[i]

在你的第一个循环中你基本上分配了 新面板为p,而不是panelArr[i]

ppanelArr[i]视为指向的两个变量 到Panel类型的对象。你初始化的事实 p并不意味着您也初始化了panelArr[i]

答案 2 :(得分:0)

在第一个循环中,您不会将对象放入数组。您只需迭代具有5个空值的数组,创建局部变量Panel p(指向null)并分配new Panel对象。 此循环数组后仍包含5个空值。

如果您不必坚持使用数组,请改用list:

List<Panel> panelList = new ArrayList<>(5); //Java7 diamond operator
panelList.add(new Panel());
panelList.add(new Panel());
panelList.add(new Panel());
panelList.add(new Panel());
panelList.add(new Panel());

当然这不是最优雅的方式,但你不会得到NPE。