java - 无法引用内部类中的非最终变量,则出现 null 错误

标签 java methods nullpointerexception

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

dReservation[i].dispose();

我有一个错误:

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

我在论坛上阅读了很多帖子,但是该问题有两种解决方案不起作用:

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 设置为我的类 (GUIShowReservations) 的 global 字段。然后我的错误消失了,但在内部方法 (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

最佳答案

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

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

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

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

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

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

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

关于java - 无法引用内部类中的非最终变量,则出现 null 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14023069/

相关文章:

Java:从方法调用中夺回控制权

java - 如何从java方法返回多个字符串值

Swift:access.property 和 access.method()

java - org.eclipse.swt.SWTException : Failed to execute runnable (java. lang.NullPointerException)

java - 如何以编程方式从文件中的值实例化动态加载的类?

java - 从 Glassfish 服务器上的 FoxPro 数据更新 sql 数据库

java - j2ee primefaces fileupload 文件保存目的地

java - 如何使用同步方法?

java - Apache POI .getCell() 错误,java.lang.NullPointerException Cannot Read Cell if blank

Java:在闪存卡游戏中单击 JButton 时抛出 NullPointerException