12

私は試した

Thread.setDefaultUncaughtExceptionHandler...


mainで、またstart(Stage primaryStage)メソッドで。動作していません。
私も試しました

public static void main(String[] args) {
 try {
  launch(args);
 }catch(Throwable t) {
  System.out.println(t.getMessage);
 }
}


例外スタックトレース。

javafx.concurrent.Task $ TaskCallable $ 2.run(Task.java:1251)at com.sun.javafx.application.PlatformImpl $ 3.run(PlatformImpl.java:141)at com.sun.glass.ui.gtk.GtkApplication ._runLoop(ネイティブメソッド)at com.sun.glass.ui.gtk.GtkApplication $ 1 $ 1.run(GtkApplication.java:56)at java.lang.Thread.run(Thread.java:662)

助けてくれてありがとう。

4

3 に答える 3

17

コードをチェックするとPlatform.runLater()(以下を参照)、例外が飲み込まれていることがわかります(146/147行目)。そのため、デフォルトのキャッチされない例外ハンドラーはそれらをキャッチできません。そのコードに基づいて、私はしません。ランナブルにtry/catchブロックを含める以外に選択肢はないと思います。

この問題は報告されており(ログインが必要です。登録は無料です)、Lombard(=来年Java8でリリースされるJavaFX 8.0)で修正する必要があることに注意してください。

または、ユーティリティメソッドを作成して、

Platform.runLater(getFxWrapper(yourRunnable));

public static Runnable getFxWrapper(final Runnable r) {
    return new Runnable() {

        @Override
        public void run() {
            try {
                r.run();
            } catch (Exception e) {
                //here you probably want to log something
                System.out.println("Found an exception");
            }
        }
    };
}

のコードPlatform.runLater

  120     private static void runLater(final Runnable r, boolean exiting) {
  121         if (!initialized.get()) {
  122             throw new IllegalStateException("Toolkit not initialized");
  123         }
  124 
  125         pendingRunnables.incrementAndGet();
  126         waitForStart();
  127 
  128         if (SystemProperties.isDebug()) {
  129             Toolkit.getToolkit().pauseCurrentThread();
  130         }
  131 
  132         synchronized (runLaterLock) {
  133             if (!exiting && toolkitExit.get()) {
  134                 // Don't schedule a runnable after we have exited the toolkit
  135                 pendingRunnables.decrementAndGet();
  136                 return;
  137             }
  138 
  139             Toolkit.getToolkit().defer(new Runnable() {
  140                 @Override public void run() {
  141                     try {
  142                         r.run();
  143                         pendingRunnables.decrementAndGet();
  144                         checkIdle();
  145                     } catch (Throwable t) {
  146                         System.err.println("Exception in runnable");
  147                         t.printStackTrace();
  148                     }
  149                 }
  150             });
  151         }
  152     }
于 2012-10-09T10:46:44.210 に答える
2

UIイベントハンドラーやExecutorServicesなどの一部のマネージスレッドは、スレッドの停止を回避するためにThrowable自体をキャプチャします。終了するスレッドのみがこのUncaughtExceptionHandlerを使用します。スローされた例外をキャプチャする場合は、これらの例外をスローできるメソッドでthsiを実行する必要があります。

UIイベントハンドラーに例外を報告する方法がある場合、それは別の方法になります。

2番目の例では、そのスレッドでスローされた例外をキャッチします。他のスレッドでスローされた例外は、そのスレッドでキャッチされます。

于 2012-09-07T13:24:10.557 に答える
2

EventDispatcherをルートノードに設定するとうまくいきました。

 public class Frame extends Pane {
    Frame() {
        setEventDispatcher(new EventDispatcher() {

            @Override
            public Event dispatchEvent(Event event, EventDispatchChain chain) {
                try {
                    return chain.dispatchEvent(event);
                } catch (final Exception e) {
                    // handle all the exceptions here 
                    return null;
                }
            }
        });
    }
}
于 2014-06-27T12:44:57.597 に答える