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

时间:2019-01-24 19:14:36

标签: java javafx

我最近开始学习JavaFX,并从一本使用JDK 9的书中获得了此代码。运行该程序时,出现了错误。我查看了其他代码,并尝试在start方法中添加“ @Override”和“ throws Exception”,但是我遇到了相同的错误。构建程序时没有错误。

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

2 个答案:

答案 0 :(得分:1)

在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/

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

enter image description here

答案 1 :(得分:1)

您的JavaFXSkel类必须是public,如Application的文档所述:

  

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

JavaFX运行时使用反射实例化Application子类的实例。它通过使用该类的公共no-arg构造函数来实现。但是,您的JavaFXSkel类没有显式声明任何构造函数,这意味着它具有隐式默认构造函数。默认构造函数与封闭类具有相同的访问修饰符,这是您所用的默认程序包访问。 Java语言规范的§8.8.9中提到了这一点 1

  

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

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

  •   
  • 默认构造函数没有形式参数,但在非private内部成员类中除外,其中默认构造函数隐式声明一个表示该类立即封闭实例的形式参数({{3} },§8.8.1§15.9.2)。

  •   

这意味着您的JavaFXSkel没有 public 无参数构造函数,因此NoSuchMethodException也没有。


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