2014-05-13 98 views
2

当我尝试将可运行队列传递给SwingUtilities.invokeLater时,我收到了一个间歇性抛出的异常,大约每执行一次应用程序中的一次。它似乎只发生在应用程序启动时,也许在事件调度线程正确设置之前?我不太确定,但如果应用程序正常运行,那么在此之后我就没有任何问题了。这里是例外:为什么SwingUtilities.invokeLater会抛出一个NullPointerException?

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: } 

任何这里的想法可能会造成什么呢?

+1

你是从构造函数调用这个方法吗?在这种情况下,MyClass.this可能为空。 –

+0

不知道这是否会有所帮助,但是你可以发布'processMyMethod()'吗? –

+0

@GáborBakos这是一个很好的观点。 –

回答

0

有一种情况适合,虽然有点违背观察“在开始” - 涉及系列化

这是否仍的情况下,可以快速看到:

class A { 
    class B implements Serializable { 
    } 
} 

现在被重新加载后B的对象可能有一个A.this被空。

这可能涉及MyClass.this(不太可能)或最终变量之一。在这种情况下,正确的解决方案是制造B级static

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

+1

正如我已经评论过的,'run'中的东西是不相关的,因为堆栈跟踪显示在调用'invokeLater'的线程上抛出异常。 – Radiodef

相关问题