これらの例外のアプリケーション ログにトレースが必要です。デフォルトでは、Java は例外をコンソールに出力するだけです。
4 に答える
Java 7 以降、sun.awt.exception.handler
ハックが機能しなくなったため、別の方法で行う必要があります。
これが解決策です(Uncaught AWT Exceptions in Java 7から)。
// Regular Exception
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());
// EDT Exception
SwingUtilities.invokeAndWait(new Runnable()
{
public void run()
{
// We are in the event dispatching thread
Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler());
}
});
EDT 内と EDT 外のキャッチされない例外には違いがあります。
別の質問には両方の解決策がありますが、EDTの部分だけを噛み砕きたい場合は...
class AWTExceptionHandler {
public void handle(Throwable t) {
try {
// insert your exception handling code here
// or do nothing to make it go away
} catch (Throwable t) {
// don't let the exception get thrown out, will cause infinite looping!
}
}
public static void registerExceptionHandler() {
System.setProperty('sun.awt.exception.handler', AWTExceptionHandler.class.getName())
}
}
shemnon s anwerへのちょっとした追加:
EDTでキャッチされないRuntimeException(またはエラー)が初めて発生すると、プロパティ「sun.awt.exception.handler」を探し、プロパティに関連付けられたクラスをロードしようとします。EDTには、デフォルトのコンストラクターを持つHandlerクラスが必要です。そうでない場合、EDTはそれを使用しません。
クラスがEDTによってインスタンス化され、静的以外の他のリソースにアクセスする機会がないため、処理ストーリーにもう少しダイナミクスを組み込む必要がある場合は、静的操作でこれを行う必要があります。これが、使用しているSwingフレームワークの例外ハンドラーコードです。これはJava1.4用に作成されており、そこでは非常にうまく機能しました。
public class AwtExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(AwtExceptionHandler.class);
private static List exceptionHandlerList = new LinkedList();
/**
* WARNING: Don't change the signature of this method!
*/
public void handle(Throwable throwable) {
if (exceptionHandlerList.isEmpty()) {
LOGGER.error("Uncatched Throwable detected", throwable);
} else {
delegate(new ExceptionEvent(throwable));
}
}
private void delegate(ExceptionEvent event) {
for (Iterator handlerIterator = exceptionHandlerList.iterator(); handlerIterator.hasNext();) {
IExceptionHandler handler = (IExceptionHandler) handlerIterator.next();
try {
handler.handleException(event);
if (event.isConsumed()) {
break;
}
} catch (Throwable e) {
LOGGER.error("Error while running exception handler: " + handler, e);
}
}
}
public static void addErrorHandler(IExceptionHandler exceptionHandler) {
exceptionHandlerList.add(exceptionHandler);
}
public static void removeErrorHandler(IExceptionHandler exceptionHandler) {
exceptionHandlerList.remove(exceptionHandler);
}
}
それが役に立てば幸い。
2つの方法があります:
- /*EDTにThread.UncaughtExceptionHandlerをインストールします*/
- システムプロパティを設定します:System.setProperty( "sun.awt.exception.handler"、MyExceptionHandler.class.getName());
後者がSUN以外のjvmで機能するかどうかはわかりません。
-
確かに、最初のものは正しくありません。それはクラッシュしたスレッドを検出するためのメカニズムにすぎません。