为了账号安全,请及时绑定邮箱和手机立即绑定

使用 JavaFX 时应用程序构造函数中的异常

使用 JavaFX 时应用程序构造函数中的异常

摇曳的蔷薇 2022-05-21 17:04:03
我最近开始学习 JavaFX,并从一本使用 JDK 9 的书中获得了这段代码。当我运行该程序时,我遇到了错误。我查看了其他代码并尝试在启动方法中添加“@Override”和“抛出异常”,但是我得到了同样的错误。构建程序时我没有收到任何错误。如果有帮助:我正在使用 JDK 11.0.2 和来自 openjfx.io 的 JavaFX。import javafx.application.*;import javafx.scene.*;importjavafx.stage.*;import javafx.scene.layout.*;class JavaFXSkel extends Application{public static void main(String[] args){    System.out.println("Launching JavaFX Application");    launch(args);}public void init(){    System.out.println("Inside the init() method");}public void start(Stage myStage){    System.out.println("Inside the start() method");    myStage.setTitle("JavaFX Skeleton");    //makes a root node with a flow layout pane    FlowPane rootNode = new FlowPane();    //Crate a scne    Scene myScene = new Scene(rootNode, 300, 200);    //Set teh scene on stage    myStage.setScene(myScene);    //Show the stage and the scene    myStage.show();}public void stop(){    System.out.println("Inside the stop() method");}}错误信息:Exception in Application constructorException in thread "main" java.lang.reflect.InvocationTargetExceptionat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)Caused by: java.lang.RuntimeException: Unable to construct Application instance: class JavaFXSkelat javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:890)at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
查看完整描述

2 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

您的JavaFXSkel班级必须是public,如以下文档中所述Application

Application子类必须声明为公共的,并且必须有一个公共的无参数构造函数。

ApplicationJavaFX 运行时使用反射实例化您的子类的一个实例。它通过使用类的公共无参数构造函数来做到这一点。但是,您的JavaFXSkel类没有显式声明任何构造函数,这意味着它具有隐式默认构造函数。默认构造函数具有与封闭类相同的访问修饰符,在您的情况下,这是默认的包访问。Java 语言规范1的§8.8.9中提到了这一点:

如果类不包含构造函数声明,则隐式声明默认构造函数。顶级类、成员类或本地类的默认构造函数形式如下:

  • 默认构造函数与类具有相同的访问修饰符,除非该类缺少访问修饰符,在这种情况下,默认构造函数具有包访问权限(第 6.6 节)。

  • 默认构造函数没有形式参数,除非在非private内部成员类中,默认构造函数隐式声明一个形式参数,表示该类的直接封闭实例(§8.8.1§15.9.2§15.9.3) .

这意味着您JavaFXSkel没有公共的无参数构造函数,因此NoSuchMethodException.


1. 不要指望初学者读过很多 JLS(如果有的话);我只是提供它作为官方参考。


查看完整回答
反对 回复 2022-05-21
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

在 Windows 10 上使用 JDK 11.0.2 工具为我工作。对源代码进行了一项更改:

public class JavaFXSkel

将您的代码保存在名为“JavaFXSkel.java”的文件中

使用以下命令编译代码。

javac --module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" --add-modules=javafx.controls -g JavaFXSkel.java

使用以下命令运行程序:

java --module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" --add-modules=javafx.controls JavaFXSkel

这个网页有帮助:https ://openjfx.io/openjfx-docs/

这是正在运行的应用程序的屏幕截图。

//img1.sycdn.imooc.com//6288ab2f0001e2d802980227.jpg

查看完整回答
反对 回复 2022-05-21
  • 2 回答
  • 0 关注
  • 418 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号