私のアプリケーションで突然奇妙な問題が発生しましたが、問題を特定できるかどうかはわかりません。私はSCCEEでバグを再現できませんでしたが、誰かが以下の2つの質問に答えることによって何が起こるのか理解する助けになるかもしれません。EDTが "system"グループに変更され、Thread.currentThread()。getContextClassLoader()がnullです
コンテキスト:
私が持っているが、基本的にこの:
...
Some treatment
->call to json-io to parse a Json String to Java Objects. see below
...
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
myUI.start();//starts my user interface
}
});
通常、すべてが正常になります。しかし、私はJson IO(JsonをJavaに解析し、私が一般的に問題なく使用するライブラリ)への呼び出しを処理に追加しました。
さて、私の他のライブラリの一つは叫んさ:
Caused by: java.lang.NullPointerException
at net.sourceforge.jeuclid.elements.support.ClassLoaderSupport.loadClass(ClassLoaderSupport.java:65)
は、いくつかの研究の後、私はそれがThread.currentThread().getContextClassLoader()
ために戻っnull
であることを発見しました。 、最後に
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread());
//returns Thread[AWT-EventQueue-0,6,system] instead of Thread[AWT-EventQueue-0,6,main]
myUI.start();//starts my user interface
}
});
:
は、私は上記のrun()
に行って、2人の処刑の唯一の違いは、現在のグループmain
に所属していたイベントの送出スレッドがsystem
に属することであることを発見しました
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader());
myUI.start();//starts my user interface
}
}
});
質問で問題を解決できます
1)EDT変更グループにはどのようなことがありますか?
2)Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader());
を書くとどうなりますか?良いアイデアか悪いアイデアですか?
ここで悪い考えは、EDTで長い操作(JSON解析)を実行することです。これは、UIへの迅速な操作と変更のためにのみ使用されることになっています。 – RealSkeptic
しかし、Jsonの解析は 'SwingUtilities.invokeLater'の呼び出しの前に行われます。それが不明な場合は申し訳ありません。私を編集させてください。 – Sharcoux
クラスローダーを手動で設定する必要があるのは非常に奇妙です。コンテキストクラスローダーをnullに設定するコードが他にもありますか? – user2864740