使用JavaFX时Application构造函数中的异常

我最近开始学习JavaFX,并从一本使用JDK 9的书中获得了此代码。运行该程序时,出现了错误。我查看了其他代码,并尝试将’@Override’和“

throws Exception”添加到start方法中,但是出现了相同的错误。构建程序时没有错误。

如果有帮助:我正在使用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)

at java.base/java.lang.Thread.run(Thread.java:834)

Caused by: java.lang.NoSuchMethodException: JavaFXSkel.<init>()

at java.base/java.lang.Class.getConstructor0(Class.java:3350)

at java.base/java.lang.Class.getConstructor(Class.java:2152)

at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:801)

at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)

at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)

at java.base/java.security.AccessController.doPrivileged(Native Method)

at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)

at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)

回答:

如以下文档中所述,您的JavaFXSkel课程必须是:publicApplication

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

JavaFX运行时Application使用反射实例化子类的实例。它通过使用该类的公共no-

arg构造函数来实现。但是,您的JavaFXSkel类没有显式声明任何构造函数,这意味着它具有隐式默认构造函数。默认构造函数与封闭类具有相同的访问修饰符,这是您所用的默认程序包访问。

Java语言规范

1的§8.8.9中提到了这一点:

__

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

*

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

*

除了在非private内部成员类中之外,默认构造函数没有形式参数,在默认情况下,默认构造函数隐式声明一个表示该类的直接封闭实例的形式参数(第8.8.1节,第15.9.2节,第15.9.3节)。

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


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

以上是 使用JavaFX时Application构造函数中的异常 的全部内容, 来源链接: utcz.com/qa/417967.html

回到顶部