无法引用内部类中的非final变量,则返回null错误

时间:2012-12-24 15:24:10

标签: java methods nullpointerexception

我对Java中的内部方法没什么问题。在线:

dReservation[i].dispose();

我有一个错误:

  

不能引用在不同方法中定义的内部类中的非最终变量dReservation

我在论坛中阅读了很多主题,但有两个问题的解决方案没有用:

Cannot refer to a non-final variable inside an inner class defined in a different method

Cannot refer to a non-final variable i inside an inner class defined in a different method

Why a non-final "local" variable cannot be used inside an inner class, and instead a non-final field of the enclosing class can?

我尝试将JDialog[] dReservation设置为我的班级global字段GUIShowReservations。然后我的错误消失了,但在内部方法(actionPerformed)而不是dReservation[i]null

当我将JDialog[] dReservation设置为final字段时,同样的历史记录。它是null

bShowReservations = new JButton("Show Reservations");
bShowReservations.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
  JDialog[] dReservation = new JDialog[10000];

  for(Object o: reservations)
  {
    rez = (Reservations)o;
    reservation.append(rez.getGroup());

    dReservation[i] = new JDialog();
    dReservation[i].setSize(400, 300);
    dReservation[i].setLocationRelativeTo(null);
    dReservation[i].setVisible(false);
    dReservation[i].setLayout( null );
    dReservation[i].setTitle("Edition");

    bEditAccept = new JButton("Edit");
    bEditAccept.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent arg0) {
            rez.setTeacher(cEditTeacher.getSelectedItem().toString());
            dao.update(rez);
            dReservation[i].dispose();
        }
    });
    bEditAccept.setSize(160, 24);
    bEditAccept.setLocation(10, 200);
    dReservation[i].add(bEditAccept);
  }
}
});
你可以帮帮我吗?我希望在我的内部方法中看到正确的JDialog,而不是null

1 个答案:

答案 0 :(得分:0)

很难回答,因为代码不完整,上面的代码没有多大意义。我会解释它实际上做了什么,因为我不认为它能做你想做的事。

代码会创建一个标有“显示预订”的按钮。单击此按钮时,会创建一万个(!)JDialog实例的数组(为什么?)。所有这些对话框都为空。

然后,循环完成,迭代预订。对于每个预留,将创建一个新的JDialog,其中包含一个名为“Edit”的新按钮,该按钮在单击时关闭对话框。 这些对话框中的最后一个存储在巨型数组中,索引为i。所有其他的都是无用的,因为它们被替换为下一个,在数组中的相同索引处。

因此,在循环结束时,您为每个预留创建了一个对话框,但只将其中一个存储在一个巨大的数组中。由于这个巨型数组是一个局部变量,所以无论如何都没有人可以使用这个对话框,因为数组及其独特的对话框超出了范围。因此,您的动作侦听器会执行与以下操作相同的操作,但速度非常慢且效率低下:

bShowReservations.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent arg0) {
        for (Object o: reservations) {
            rez = (Reservations) o;
            reservation.append(rez.getGroup());
        }
    }
}

也不是说您的代码充满了不良做法。您没有使用通用集合,您在按钮上设置大小,您没有使用布局管理器而是设置任意位置......

如果你告诉我们应该做什么代码,我们可以帮助你做到这一点。