最近別の Java ソフトウェア (「外部」ソフトウェアと呼びます) に統合された Java ソフトウェアがあります。2 つのソフトウェア間の「通信」には、リスナーとコールバック メカニズムを使用します。
「外部」ソフトウェアの作成者は、私のコードに EDT 違反があるために NullPointerException が発生したと言っています。それは本当ですか?
最近別の Java ソフトウェア (「外部」ソフトウェアと呼びます) に統合された Java ソフトウェアがあります。2 つのソフトウェア間の「通信」には、リスナーとコールバック メカニズムを使用します。
「外部」ソフトウェアの作成者は、私のコードに EDT 違反があるために NullPointerException が発生したと言っています。それは本当ですか?
EDT 違反は、これらのコンポーネントが何らかの方法で Swing コンポーネントと対話する場合 (たとえば、コンポーネントのリスナーとしてアタッチされている場合)、このような動作を引き起こす可能性があります。もちろん、これらのメソッドにアサーションがあるかどうか、またアサーションを有効にすると、EDT ルールに違反している場所がコードによって明確に示されるかどうかを確認することもできます。
編集(コメントに応じて):
EDT の基本的な経験則は、新しいスレッドを開始するときはいつでも、そのコードを Runnable でラップして SwingUtilities.invokeLater(Runnable )。規律と追加の設計作業が必要ですが、本格的なアプリケーションでは間違いなく必要です。
同期動作 (ダイアログをポップアップして応答を待つなど) に多大な投資をしている場合は、SwingUtilities.invokeAndWait(Runnable) を呼び出すことができますが、その必要性をできるだけ避けるようにしてください。また、EDT を使用していないときにそのメソッドを呼び出すようにしてください。それ以外の場合は機能しません。
このようなコードを管理下に置くための 1 つの方法は、次のような assert を使用することです。
assert (EventQueue.isDispatchThread())
GUI に触れ、アサートを有効にして実行するコードがあればどこでも。そうすれば、Swing コンポーネントに誤って接触している正確なコード パスを確認できます。