JavaFX2-捕获所有运行时异常

JavaFX2-捕获所有运行时异常,java,exception-handling,javafx-2,Java,Exception Handling,Javafx 2,我试过了 Thread.setDefaultUncaughtExceptionHandler... public static void main(String[] args) { try { launch(args); }catch(Throwable t) { System.out.println(t.getMessage); } } 在main中,也在start(Stage primaryStage)方法中。它不起作用了。 我也试过了 Thread.setDefault

我试过了

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

在main中,也在start(Stage primaryStage)方法中。它不起作用了。
我也试过了

Thread.setDefaultUncaughtExceptionHandler...
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) PlatformImpl$3.run(PlatformImpl.java:141) 位于com.sun.glass.ui.gtk.GtkApplication.\u runLoop(本机方法) com.sun.glass.ui.gtk.GtkApplication$1$1.run(GtkApplication.java:56) 运行(Thread.java:662)


感谢您的帮助。

一些托管线程(如UI事件处理程序和ExecutorServices)可自行捕获丢弃,以避免线程死亡。只有死的线程才会使用此UncaughtExceptionHandler。如果您想捕获抛出的异常,您必须在可以抛出这些异常的方法中执行thsi

如果UI事件处理程序有一种报告异常的方法,那么它将是另一种方法


第二个示例将捕获该线程中抛出的异常。在其他线程上抛出的异常将被该线程捕获。

如果您检查
Platform.runLater()
(见下文),您将看到异常被吞没(第146/147行),因此默认的未捕获异常处理程序将无法捕获它们-基于该段代码,我认为除了在Runnable中包含try/catch块之外,您没有其他选择

请注意(需要登录-注册是免费的),并且应该在Lombard中修复(=Java FX 8.0将于明年与Java 8一起发布)

您也可以创建一个实用程序方法并调用

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");
            }
        }
    };
}
:


将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;
                }
            }
        });
    }
}

您是否尝试捕获所有异常类的基类?NullPointerException如何?所有异常和错误的处理都是相同的。您的问题应该有一个优雅的解决方案。查看源代码以查看是否存在源代码。;)在Java 7中,setDefaultUncaughtExceptionHandler也应该适用于EDT线程。对于Java6,请看:我已经悬赏了,因为我认为这个问题需要更多的关注。基于这个新的“不可调度”原则,我们最终可能会使用不同的异常管理“体系结构”,但接下来需要一些示例和解释,因为我们中的许多人正确地认为setDefaultUncaughtExceptionHandler应该可以工作。对不起,我让赏金到期了:-(,而我应该给出这个答案。换一个新的怎么样?@AgostinoX我以前也遇到过这种情况;-)您不必。感谢您指出这一点。但是,您的包装器将仅适用于可运行代码中直接抛出的异常。例如,如果您在可运行代码中设置场景,它将在场景构建期间捕获异常,但不会捕获稍后发生的异常,例如,通过实际使用场景时发生的事件…@MartinMeyer Those其他异常应该是“可捕获的”(即不被吞没)。与下面的注释相同。包装有效吗?看到有问题的异常在(现在是内线程,直到被吞没),那么我们会得到该异常对象的任何信息吗?请原谅我的基本疑问,请尝试{r.run();//额外代码}catch(Throwbale t){t.printStackTrace();}堆栈跟踪是r的吗?