JavaFX8(Lombard)全局异常处理

JavaFX8(Lombard)全局异常处理,java,exception-handling,javafx-8,Java,Exception Handling,Javafx 8,我目前正试图用JavaFX8构建一个应用程序,但无法实现未捕获的异常处理。由于本文()的原因,它应该用JavaFX8(Lombard)修复/实现,但我在网上找不到任何东西 我不想走这种老生常谈的路,你能给我一个提示,在哪里可以搜索更多的信息吗?据我所知,没什么大不了的;您只需使用java.lang.Thread中的常规未捕获异常处理 import javafx.application.Application; import javafx.scene.Scene; import javafx.sc

我目前正试图用JavaFX8构建一个应用程序,但无法实现未捕获的异常处理。由于本文()的原因,它应该用JavaFX8(Lombard)修复/实现,但我在网上找不到任何东西


我不想走这种老生常谈的路,你能给我一个提示,在哪里可以搜索更多的信息吗?

据我所知,没什么大不了的;您只需使用java.lang.Thread中的常规未捕获异常处理

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class UncaughtExceptionTest extends Application {

    @Override
    public void start(Stage primaryStage) {

        // start is called on the FX Application Thread, 
        // so Thread.currentThread() is the FX application thread:
        Thread.currentThread().setUncaughtExceptionHandler((thread, throwable) -> {
            System.out.println("Handler caught exception: "+throwable.getMessage());
        });

        StackPane root = new StackPane();
        Button button = new Button("Throw exception");
        button.setOnAction(event -> {
            throw new RuntimeException("Boom!") ;
        });
        root.getChildren().add(button);
        Scene scene = new Scene(root, 150, 60);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

詹姆斯的回答对我帮助很大,但我忽略了他的评论。因此,如果其他人面临同样的问题,我将此作为补充回答

在我的例子中,我的JavaFX应用程序必须面对并捕获内存不足错误。对于同一代码,OOM有时出现在JavaFX主线程上,有时不出现(可能是“InvokeLaterDispatcher”线程、“Timer”线程、“ProcessReaper”线程,…),具体取决于哪个线程首次耗尽内存。因此,错误并不总是被捕获,应用程序也不总是按要求退出

因此,为了确保我的应用程序记录并退出,我必须使用James_D在其评论中提到的:

Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {
    System.out.println(throwable.getClass() + " detected from default UEH.\nWill exit now");
    System.exit(1);            
});

现在,错误出现时总是会被捕获。

您能给出一个导致问题的示例(代码)吗?并不是特定的代码导致了问题,我只是没有必要寻找有关新实现的异常处理的更多信息。全局异常处理的目的是捕获未处理的异常,向用户打印一条简短的抱歉消息,然后退出。但这里不是有多个线程需要担心吗?比如JavaFX应用程序线程?我认为您需要使用Platform.runLater()再次执行此操作。好的,对了,处理完毕-其他线程如何?调用Thread.setUncaughtExceptionHandler(改为静态方法)是否捕获所有内容?Javadoc似乎没有说得很清楚。我似乎很清楚。如果线程本身没有未捕获的异常处理程序集,并且它所属的线程组没有覆盖未捕获的异常方法,则调用
thread.setDefaultUncaughtExceptionHandler()
(如果有)中的处理程序集。如果使用短语“all”或“any”,则会更清楚一些线程,而不是让读者通过静态上下文推断。或者这看起来太简单了,我下意识地怀疑。。。