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

Java 为什么每个循环都不起作用?,java,loops,for-loop,foreach,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 GUIV

我的代码不起作用:

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)
线程“AWT-EventQueue-0”java.lang.NullPointerException中的异常 在GUIVehicles$NewSportsCarDialog.(GUIVehicles.java:65) 但是,如果我用这个for循环替换for each循环,它就会工作

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

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

您的for each与此类似:

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

因此,对
p
的赋值显然对数组本身没有影响——您只是将
p
重定向到其他地方,这对数组没有影响。因此,在for-each循环的末尾,所有数组元素仍然是
null
。第二个代码段是填充数组的合适方法。

因为
p
是一个局部变量,所以它不是直接的
panelArr[i]

在第一个循环中,基本上指定 将新面板设置为
p
,而不是
panelArr[i]

p
panelArr[i]
看作两个变量 到
面板类型的对象
。你初始化的事实
p
并不意味着您也初始化了
panelArr[i]

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

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

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());
List panelList=newarraylist(5)//Java7菱形运算符
panelList.add(新面板());
panelList.add(新面板());
panelList.add(新面板());
panelList.add(新面板());
panelList.add(新面板());

当然,这不是最优雅的方式,但您将无法获得NPE。

非常感谢。我确信是我在最基本的层面上没有理解它,这被证明是正确的。