簡體   English   中英

使用 JavaFX 時應用程序構造函數中的異常

[英]Exception in Application constructor when using 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)

您的JavaFXSkel類必須是public ,如Application的文檔中所述:

Application子類必須聲明為 public 並且必須具有公共無參數構造函數。

JavaFX 運行時使用反射實例化Application子類的實例。 它通過使用類的公共無參數構造函數來做到這一點。 但是,您的JavaFXSkel類沒有顯式聲明任何構造函數,這意味着它具有隱式默認構造函數。 默認構造函數與封閉類具有相同的訪問修飾符,這是您的情況下的默認包訪問權限。 Java 語言規范1 的§8.8.9中提到了這一點:

如果類不包含構造函數聲明,則隱式聲明默認構造函數。 頂級類、成員類或局部類的默認構造函數的形式如下:

  • 默認構造函數與類具有相同的訪問修飾符,除非類缺少訪問修飾符,在這種情況下,默認構造函數具有包訪問權限(第6.6 節)。

  • 默認構造函數沒有形式參數,除非在非private內部成員類中,默認構造函數隱式聲明了一個形式參數,表示該類的直接封閉實例(第8.8.1 節、第15.9.2 節、第15.9.3 節) )。

這意味着您的JavaFXSkel沒有公共無參數構造函數,因此是NoSuchMethodException


1. 不要指望初學者已經閱讀了很多(如果有的話)JLS; 我只是提供它作為官方參考。

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

這是正在運行的應用程序的屏幕截圖。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM