Java FXMLLoader.load(url)赢得';别上当

Java FXMLLoader.load(url)赢得';别上当,java,exception,javafx-8,fxmlloader,Java,Exception,Javafx 8,Fxmlloader,我正在处理javaFX应用程序,我想在应用程序启动时崩溃时运行一些代码,因此基本上是在围绕FXMLLoader.load()methode的catch子句中的start()methode中,但由于某些原因,它不会捕获它抛出的IOException(我在getResource()中放了一个错误的url)methode,以便引发异常) 但是如果我用基类Exception交换IOException,那么在IOException之前是否有一个更深层次的嵌套Exception抛出,我不知道?(控制台显示一

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

但是如果我用基类
Exception
交换
IOException
,那么在
IOException
之前是否有一个更深层次的嵌套
Exception
抛出,我不知道?(控制台显示一个
java.lang.reflect.InvocationTargetException

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

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
可以捕获
NullPointerException
RuntimeException

使用
exception
时会捕获异常原因,因为
RuntimeException
扩展了
exception

要捕获此特定异常,可以执行以下操作之一

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


另外,
java.lang.reflect.InvocationTargetException
不会从代码中抛出,而是从调用
public void start(Stage primaryStage)的JavaFX中抛出
由于存在异常,JavaFX将原始异常包装在
java.lang.reflect.InvocationTargetException

中,因此引发的异常是
NullPointerException
,它不是
IOException
的子类,这就是未捕获异常的原因

NullPointerException
是一种
RuntimeException
因此,如果要捕获
NullPointerException
可以捕获
NullPointerException
RuntimeException

使用
exception
时会捕获异常原因,因为
RuntimeException
扩展了
exception

要捕获此特定异常,可以执行以下操作之一

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

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