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

Javafx 为什么start()抛出异常?,javafx,javafx-8,Javafx,Javafx 8,为什么下面的代码声明可以引发异常? 虽然这是方法根据的外观,但是删除“抛出异常”部分不会导致编译错误。文档没有提到为什么它是必要的 public class GUI extends Application { public static void main(String... args) { launch(args); } @Override public void start(Stage stage) throws Exception {

为什么下面的代码声明可以引发异常? 虽然这是方法根据的外观,但是删除“抛出异常”部分不会导致编译错误。文档没有提到为什么它是必要的

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();
    }
}

在您发布的示例代码中,这不是必需的。正如您所观察到的,在
应用程序
类中声明的抽象方法声明它可能引发异常。这意味着

  • 实现该方法并声明被重写的方法可能引发异常是合法的
  • 任何调用
    Application.start(…)
    的人都必须做好捕获异常的准备
  • 第二点很重要,因为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(...);
    
        // ...
    }
    

    如果在
    start
    方法中没有
    throws-Exception
    (或者至少
    throws-IOException
    ),则不会编译此文件;反过来,如果
    应用程序
    中的抽象方法没有声明,它将不会编译。它可能会抛出异常。

    它抛出异常以便捕获。这样,如果出现错误,您的整个应用程序将无法运行explode@EyeOfTheHawks:是的,但通常情况下,您的代码类似于可以抛出异常的流,您需要“抛出”或使用“try/catch”来处理该异常。在这里,我可以毫无问题地删除它,这怎么可能呢?@TrudleR在那个例子中,你必须有一个
    try
    -
    catch
    ,或者让你使用的方法声明它可能会引发异常。在这个例子中,你可以删除它,因为你写的代码不能引发任何选中的异常。将它放在那里是合法的,因为(从编译器的角度来看)您的代码完全可能抛出未经检查的异常(
    NullPointerException
    ,等等)。