【发布时间】:2014-07-01 11:31:36
【问题描述】:
当我尝试将可运行对象传递给SwingUtilities.invokeLater 时,我会间歇性地抛出一个异常,大约每五次执行我的应用程序就有一次。它似乎只在应用程序启动时发生,可能在正确设置事件调度线程之前?我不太确定,但如果应用程序正常启动,那么之后我就没有任何问题了。这是一个例外:
Exception in thread "Thread-3" java.lang.NullPointerException
at java.awt.EventQueue.invokeLater(Unknown Source)
at javax.swing.SwingUtilities.invokeLater(Unknown Source)
at com.mypackage.MyClass.myMethod(MyClass.java:126)
我不确定为什么调用SwingUtilities.invokeLater 会这样死。一定是发生了什么蠢事。供参考,这里是MyClass.java的实际源码:
118: public void myMethod(final VariableA variableA, final VariableB variableB, final VariableC variableC) {
119: if (variableA == null)
120: throw new NullPointerException("no variable A");
121: if (variableB == null)
122: throw new NullPointerException("no variable B");
123: if (variableC == null)
124: throw new NullPointerException("no variable C");
125:
126: SwingUtilities.invokeLater(new Runnable() {
127: @Override
128: public void run() {
129: MyClass.this.processMyMethod(variableA, variableB, variableC);
130: });
131: }
132: }
这里有什么想法可能导致这种情况吗?
【问题讨论】:
-
你是从构造函数调用这个方法吗?在这种情况下,MyClass.this 可能为 null。
-
不确定这是否会有所帮助,但您也可以发布
processMyMethod()吗? -
@GáborBakos 如果可能的话,堆栈跟踪看起来会非常不同。
-
检查
EventQueue.invokeLater()(JDK 1.6, YMMV) 的源代码,除了EventQueue本身之外,看起来null的内容并不多。要对此进行调试,您可以尝试检查Toolkit.getEventQueue()是否为空。不过,我以前从未见过它。您能否将此代码移动到将由 Swing 事件本身触发的内容,例如在显示你的主窗口? -
processMyMethod()根据收到的数据设置JXTreeTable节点。它相当长,它是MyClass的私人成员。此外,MyClass扩展了DefaultTreeTableModel。
标签: java swing event-dispatch-thread