【问题标题】:Exception in Application constructor when using JavaFX使用 JavaFX 时应用程序构造函数中的异常
【发布时间】:2019-01-25 04:25:33
【问题描述】:

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

【问题讨论】:

  • 您的应用程序的依赖项似乎存在冲突。你在使用一些依赖管理的工具吗?
  • 尝试在start()init() 上同时抛出@Overridethrows Exception
  • 添加 @Overridethrows Exception 无效。至于依赖管理,我没有使用任何工具。如果有帮助,我正在使用 Intellij
  • 您的第三次导入看起来很可疑。 importjavafx.stage.*;
  • @SAIFULHAQUE 检查此链接openjfx.io/openjfx-docs

标签: java javafx


【解决方案1】:

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

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

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

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

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

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

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


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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-09
      • 2016-04-09
      • 2017-02-18
      • 2023-01-12
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      相关资源
      最近更新 更多