为什么主要方法的类应该在javafx中公开?

时间:2016-03-29 19:25:08

标签: java javafx

这是JavaFX项目的netbeans IDE的模板代码。 如果从BombDroid类中清除public关键字,则会出现运行时错误。为什么? 注意:我知道main应该是public。但是为什么Bombdroid类应该公开?

package bombdroid;

import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.shape.*;
import javafx.stage.Stage;

public class BombDroid extends Application {
    @Override
    public void start(Stage primaryStage) {
        Group root = new Group();
        Scene scene = new Scene(root);
        Line line = new Line(0, 0, 500, 500);
        Rectangle man = new Rectangle(0, 0, 100, 100);
        root.getChildren().add(line);
        root.getChildren().add(man);
        primaryStage.setScene(scene);
        primaryStage.show();
        }
    public static void main(String[] args) {
        launch(args);
        }
    }

1 个答案:

答案 0 :(得分:3)

JavaFX应用程序的启动程序通过反射工作,其结果和使用方式是必须将JavaFX Application类声明为public。

运行示例时获得的特定错误消息(没有主方法,这对JavaFX应用程序来说是不必要的)是:

Exception in Application constructor
Exception in thread "main" 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 sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class BombDroid
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:907)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodException: BombDroid.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.getConstructor(Class.java:1825)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:818)
    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)

如您所见,系统正在为您的应用程序类寻找一个无参构造函数。追踪LauncherImpl.java:818的源代码是:

Constructor<? extends Application> c = appClass.getConstructor();

getConstructor()方法的文档声明:

  

返回一个Constructor对象,该对象反映此Class对象所表示的类的指定公共构造函数。

     

如果找不到匹配的方法,则@throws NoSuchMethodException。

如果您的应用程序类不是公共的,则它没有公共构造函数,并且在您尝试启动它时会返回NoSuchMethodException。这就是正在发生的事情,导致应用程序的启动失败。

除了

请注意,JavaFX的Application类是公共的要求与非JavaFX应用程序不同。例如,Java中最简单的hello world程序不需要运行公共类,只需要公共main方法。

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("hello, world");
    }
}