1

回答:

如果你曾经看到这些线条并且像我一样被迷惑,这就是它们的意思。

Thread[AWT-EventQueue-0] (Suspended (exception NullPointerException))

EventDispatchTread.run() line: not available [local variables unavailable]

并不是说这些变量不可用,因为它们潜伏在一个潮湿的图书馆里的神秘裹尸布后面。不不,他们只是超出了范围!这仍然是你的错,你仍然必须找到空值,不,你不能责怪图书馆。重要的教训!

问题:

作为初学者,对我来说最令人沮丧的事情之一就是图书馆!这是一种爱恨交织的关系:一方面他们让我做我通常不明白的事情如何处理我理解的代码,另一方面因为我不完全理解他们,他们有时会抛出一个使用其他工作正常的代码扳手!这是因为我不理解使用这些库时可能发生的错误,因为我没有编写它们,而且当其中一个导入开始起作用时,eclipse 并没有给我太多的帮助......

所以这就是问题所在:我一直在使用 java.awt.event 来处理屏幕上的一堆 JButton。当我使用我制作的其中一个按钮时出现错误。错误是:

Thread[AWT-EventQueue-0] (Suspended (exception NullPointerException))

EventDispatchTread.run() line: not available [local variables unavailable]

这是什么意思?可能是什么原因造成的?我很尴尬地发布代码,但如果你能忍受尝试破译我糟糕的风格,这里是似乎导致这个错误被抛出的方法。

public void actionPerformed(ActionEvent e) {
    String cmd = e.getActionCommand();
    String name;

code...

if(cmd.equals("Play")) {
        name = field.getText();
        card = getCard(name);
        
        if(card != null) {
            if(rules.zoneHasCard(card, rules.hand)) {
                display.updateStatusMessage(rules.play(card));
                field.setText("");
                display.updateHand(rules.zoneList("hand"));
                display.updateDiscard(rules.zoneList("Discard")); // This is the error here! The discard Zone was empty!
            }
            else {
                field.setText("You do not have " + card.getName());
                field.selectAll();
            }
        }
        else {
            field.setText("That cardname is unused");
            field.selectAll();
        }
    }
}
4

5 回答 5

4

欢迎来到编写 GUI 代码的复杂性。

当您运行 Swing 程序时,会创建一个称为 Event Dispatch Thread 的后台线程。例如,当用户单击 JButton 时,JButton 使用此事件调度线程创建并触发一个事件。因此得名:它是调度事件的线程!

你的代码:

public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
        String name;

// more code...
}

由此事件调度线程调用,因此您的代码可以处理该事件。

在您的代码中的某处,您正试图对当前等于 null 的变量执行某些操作。错误消息告诉您,“嘿,在事件调度线程上运行一些代码时,我在您的代码中遇到了 NullPointerException” 。

为什么您没有收到更多信息?可能您将 Eclipse 配置为在编译时不包含调试信息?

现在,我建议在您的 actionPerformed 方法中添加一些行来显示变量的状态:

System.out.println("field = " + field);
System.out.println("rules = " + rules);
System.out.println("display = " + display);

看看这是否显示任何空值。

即使 NullPointerException 来自库,堆栈跟踪也会显示代码的哪一行调用了该库。但前提是您已将 Eclipse 配置为生成调试信息。

从长远来看,通过 Sun 的 Swing 教程来了解有关这些问题的更多信息。

于 2008-12-05T11:12:02.317 回答
1

对空对象的任何方法调用都会引发空指针异常。

在您的代码中,规则、名称或显示可能为空并导致异常。

于 2008-12-05T10:43:34.447 回答
1

使用调试器(例如包含在 Eclipse IDE 中的调试器)并在 actionPerformed() 方法的开始处设置断点,然后逐行遍历它以查看您尝试调用方法的变量何时为空。

于 2008-12-05T10:58:33.373 回答
1

只是不要在两行之后停止读取堆栈跟踪。在堆栈跟踪的某处,您将识别出您编写的类/方法之一的名称。开始看那里。(顺便说一句,人们在调试器中花费了很多时间:-))

于 2008-12-05T11:10:42.367 回答
0

您可能忘记实际设置 ActionCommand。

ActionEvent API Doc中有一条关于 getActionCommand() 可能的空结果的注释。

于 2008-12-05T11:09:57.267 回答