如果你看到这些线条并像我一样被误解,这就是它们的含义。
Thread[AWT-EventQueue-0] (Suspended (exception NullPointerException))
EventDispatchTread.run() line: not available [local variables unavailable]
并不是变量不可用,因为它们隐藏在图书馆某个地方的一个神秘的裹尸布背后。不,不,他们只是超出了范围!它仍然是你的错,你仍然必须找到空,不,你不能责怪图书馆。重要的一课!
对我来说最令人沮丧的事情之一,作为初学者是图书馆!这是一种爱/恨的关系:一方面他们让我做一些我通常不会理解如何处理我理解的代码的事情,另一方面因为我不完全理解他们,他们有时会抛出一个代码中的扳手,否则正常工作!这是因为我不理解使用这些库时可能发生的错误,因为我没有编写它们,并且因为当一个导入开始执行时,eclipse并没有给我很多帮助... < / p>
所以这就是问题所在:我一直在使用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();
}
}
}
答案 0 :(得分: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 Tutorial了解有关这些问题的更多信息。
答案 1 :(得分:1)
对null对象的任何方法调用都会引发空指针异常。
在您的代码中,规则,名称或显示可能为空并导致异常。
答案 2 :(得分:1)
使用调试器(例如eclipse IDE中包含的调试器)并在actionPerformed()方法的开头设置断点,然后逐行逐步查看,以查看尝试调用方法的变量何时是空的。
答案 3 :(得分:1)
只是不要在两行之后停止读取堆栈跟踪。在堆栈跟踪的某处,您将识别您编写的类/方法之一的名称。开始寻找那里。 (顺便说一下,人们在调试器中花费了很多时间: - ))
答案 4 :(得分:0)
您可能忘记了实际设置ActionCommand。
在ActionEvent API Doc中有关于getActionCommand()的可能null结果的注释。