catch块中的语句不会执行

时间:2014-01-13 02:45:30

标签: java javafx

在下面的代码中,我使用了错误的文件名(wrongFileName.fxml)来加载,以便测试catch块。但是,catch块内的语句不会执行。请注意,即使没有声明在控制台上打印堆栈跟踪,仍会打印堆栈跟踪。请告诉我,为什么会这样?

public class First extends Application {

    @Override
    public void start(Stage stage){
        Parent root = null;
        try {
            root = FXMLLoader.load(getClass().getResource("wrongFileName.fxml"));
        } catch (IOException ex) {
            System.out.println("SomeTextForCheck");
        }
    }
}

堆栈追踪:

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.javafx.main.Main.launchApp(Main.java:698)
    at com.javafx.main.Main.main(Main.java:871)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403)
    at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47)
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115)
    at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2773)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2757)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2743)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2730)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2719)
    at first.First.start(First.java:29)
    at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
    at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:216)
    at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179)
    at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication$3$1.run(GtkApplication.java:89)
    ... 1 more

2 个答案:

答案 0 :(得分:0)

从堆栈跟踪中抛出RuntimeException。所以请在代码中处理RuntimeException和Exception类。始终记录异常或使用stacktrace,否则很难调试     公共类首先扩展Application {

@Override
public void start(Stage stage){
    Parent root = null;
    try {
        root = FXMLLoader.load(getClass().getResource("wrongFileName.fxml"));
    } catch (IOException ex) {
        System.out.println("SomeTextForCheck");
        ex.printStackTrace() 
    }
    catch(RuntimeException ex) {
        System.out.println("SomeTextForCheck");
        ex.printStackTrace()
    }
    catch(Exception ex) {
        System.out.println("SomeTextForCheck");
        ex.printStackTrace()  
    }
}

答案 1 :(得分:0)

您需要捕获正确的异常才能打印堆栈跟踪。理想情况下,您不应该获得像NullPointerException这样的异常,开发人员需要在代码中处理这些条件。