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

我最近开始学习 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 constructor

Exception in thread "main" java.lang.reflect.InvocationTargetException

at 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 JavaFXSkel

at 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)


摇曳的蔷薇
浏览 420回答 2
2回答

慕虎7371278

您的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(如果有的话);我只是提供它作为官方参考。

Cats萌萌

在 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/这是正在运行的应用程序的屏幕截图。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java