为什么start()会抛出异常?

时间:2015-03-24 14:07:26

标签: javafx javafx-8

为什么以下代码声明可以抛出异常? 虽然这是方法应该根据javadocs看起来的方式,但删除"抛出异常"部分不会导致编译错误。文档没有提到为什么有必要。

public class GUI extends Application {

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

    @Override
    public void start(Stage stage) throws Exception {
        BorderPane bp = new BorderPane();
        Scene scene = new Scene(bp, 640, 480);
        stage.setScene(scene);
        stage.show();
    }
}

1 个答案:

答案 0 :(得分:4)

您发布的示例代码中没有必要。正如您所观察到的,Application类中声明的抽象方法声明它可能会抛出异常。这意味着

  1. 实现该方法是合法的,并声明被覆盖的方法可能会抛出异常
  2. 任何调用Application.start(...)的人都必须准备好捕捉异常
  3. 第二点变得很重要,因为该方法由JavaFX框架调用,通常在启动时或通过调用launch(...)。因此,您可以确保JavaFX框架必须处理从start(...)方法实现中抛出的任何异常。

    在您发布的代码中,没有任何内容可以抛出异常,因此您可以轻松删除throws子句。但是,例如,如果您使用FXML,则会很有用:

    @Override
    public void start(Stage primaryStage) throws Exception {
    
        // FXMLLoader.load(...) throws an IOException, no need to handle it here
        // we just let it propagate up and the JavaFX framework will handle it
        Parent root = FXMLLoader.load(...);
    
        // ...
    }
    

    如果您在throws Exception方法中没有start(或至少throws IOException),则无法编译;反过来,如果Application中的抽象方法未声明它可能会抛出异常,则无法编译。