我正在开发 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
,请捕获 NullPointerException
或 RuntimeException
当您使用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/