【问题标题】:Why would SwingUtilities.invokeLater be throwing a NullPointerException?为什么 SwingUtilities.invokeLater 会抛出 NullPointerException?
【发布时间】: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


【解决方案1】:

有一种情况适合,尽管与“一开始”的观察有点相反 - 涉及 序列化

是不是还是这样,很快就能看出:

class A {
    class B implements Serializable {
    }
}

现在,在重新加载 B 对象后,A.this 可能为空。

这可能与 MyClass.this(不太可能)或最终变量之一有关。在这种情况下,正确的解决方案是设置 B 类static

但这一切都是猜测。一个可疑的猜测是processMyMethod 使用基类作为参数,并且它们的 this 为空。并且不知何故已经在早些时候得到了一个例外(?)。所以 MyClass.this 为空?

【讨论】:

  • 正如我已经评论过的,run 中的内容无关紧要,因为堆栈跟踪显示异常是在调用invokeLater 的线程上引发的。
猜你喜欢
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多