这是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);
}
}
答案 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");
}
}