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(…)
的人都必须做好捕获异常的准备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
,等等)。