java - FXMLLoader.load(url) 抛出的 IOException 将不会被捕获

标签 java exception javafx-8 fxmlloader

我正在开发 javaFX 应用程序,我想在应用程序启动时崩溃时运行一些代码,所以基本上在 FXMLLoader.load() 方法周围的 catch 子句中的 start() 方法中运行,但由于某种原因,它不会捕获它抛出的 IOException 。(我在 getResource() 方法中放置了错误的 url,以便引发异常)

但是,如果我将 IOException 与基类 Exception 交换,它就可以工作,那么在我不知道的 IOException 之前是否抛出了更深层次的嵌套 Exception ? (控制台显示java.lang.reflect.InitationTargetException)

更新: 我尝试将 getResource()FXMLoader.load() 函数分开,并用一条消息将它们分开,以查看抛出 Exception 的位置。 结论:Exception 100% 由 FXMLLoader.load() 方法抛出。

public void start(Stage primaryStage) {

    stage = primaryStage;

    try {
        URL url = getClass().getClassLoader().getResource("view/Lgin.fxml");
        System.out.println("URL loaded");
        Parent root = FXMLLoader.load(url);
        System.out.println("FXML loaded");
        stage.setScene(new Scene(null));
        stage.getIcons().add(new Image("resources/icons/Login.png"));
        stage.setTitle("main");
        stage.setResizable(false);
        stage.centerOnScreen();
        stage.show();
    } catch(IOException e) {
        //LOGGER.log(Level.SEVERE, e.toString(), e);
        //System.exit(0);
        System.out.println("catch reached");
    }
}

堆栈跟踪:

URL loaded
Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at launcher.DigitalCourt.start(DigitalCourt.java:42)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    ... 1 more
Exception running application launcher.DigitalCourt
Java Result: 1

最佳答案

抛出的异常是 NullPointerException,它不是 IOException 的子类,这就是异常未被捕获的原因。

NullPointerException 是一个 RuntimeException,因此如果您想捕获 NullPointerException,请捕获 NullPointerExceptionRuntimeException

当您使用Exception时,会捕获异常的原因,因为RuntimeException扩展了Exception

要捕获这个特定的异常,您可以执行以下任一操作

catch(IOException|NullPointerException e) {
    //LOGGER.log(Level.SEVERE, e.toString(), e);
    //System.exit(0);
    System.out.println("catch reached");
}

catch(IOException|RuntimeException e) {
    //LOGGER.log(Level.SEVERE, e.toString(), e);
    //System.exit(0);
    System.out.println("catch reached");
}

此外,java.lang.reflect.InitationTargetException 不会从您的代码中抛出,而是从调用您的 public void start(Stage PrimaryStage) 的 JavaFX 抛出,因为 JavaFX 将原始异常包装在 java.lang.reflect.InitationTargetException

关于java - FXMLLoader.load(url) 抛出的 IOException 将不会被捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57894511/

相关文章:

java - 在 Java (Swing) 中可以注册多个按键监听器事件吗?

JavaFX 应用程序无法使用 native exe bundle 启动

带有自定义单元格工厂的 javafx ListView 不保留所选单元格

java - 如何在不同的 URL 公开 JaxWS Web 服务端点?

Javadoc 错误 : unmappable character for encoding ASCII

java - 更新 Nutch 以获取所获取的每个 URL 的父级

javafx-8 - JavaFX Canvas 更新

java - 有没有办法在另一个类的 hibernate validator 中获取约束的声明值?

php - 以不同的名称重新抛出异常?什么是标准做法?

java - 在 Glassfish 上部署 Web 应用程序时出错