我有这个代码不起作用:
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循环应该是等效的。显然情况并非如此,我想知道为什么?
答案 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]
。
将p
和panelArr[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。