【问题标题】:Why does this for each loop not work?为什么每个循环都不起作用?
【发布时间】:2014-01-30 15:31:58
【问题描述】:

我有这段代码不起作用:

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 each 循环的文档,两个 for 循环应该是等效的。显然情况并非如此,我想知道为什么?

【问题讨论】:

    标签: java loops for-loop foreach


    【解决方案1】:

    您的 for-each 与此类似:

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

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

    【讨论】:

    • 非常感谢。我确信是我在最基本的层面上没有理解它,事实证明这是正确的。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      在第一个循环中,您不会将对象放入数组中。您只需遍历具有 5 个空值的数组,创建局部变量 Panel p(指向 null)并分配一个 new 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());
      

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

      【讨论】:

        猜你喜欢
        • 2016-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多