2014-05-13 127 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

相關問題