Исключение в конструкторе приложений при использовании JavaFX - PullRequest
0 голосов
/ 24 января 2019

Я недавно начал изучать JavaFX и получил этот код из книги, в которой используется JDK 9. Когда я запустил программу, у меня появились ошибки. Я посмотрел на другой код и попытался добавить «@Override» и «throws Exception» в метод start, однако я получил те же ошибки. Я не получаю ошибок при сборке программы.

Если это поможет: я использую JDK 11.0.2 и JavaFX из openjfx.io.

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 голосов
/ 24 января 2019

Ваш JavaFXSkel класс должен быть public, как указано в документации Application:

Подкласс Application должен быть объявлен открытым и должен иметь открытый конструктор без аргументов.

Среда выполнения JavaFX создает экземпляр вашего подкласса Application, используя отражение. Это делается с помощью открытого конструктора класса no-arg. Однако ваш класс JavaFXSkel явно не объявляет никаких конструкторов, что означает, что он имеет неявный конструктор по умолчанию. Конструктор по умолчанию имеет тот же модификатор доступа, что и включающий класс, который является доступом к пакету по умолчанию в вашем случае. Это упоминается в §8.8.9 Спецификации языка Java 1 :

Если класс не содержит объявлений конструктора, тогда конструктор по умолчанию объявляется неявно. Форма конструктора по умолчанию для класса верхнего уровня, класса-члена или локального класса выглядит следующим образом:

  • Конструктор по умолчанию имеет тот же модификатор доступа, что и класс, если только в классе нет модификатора доступа, и в этом случае конструктор по умолчанию имеет доступ к пакету ( §6.6 ).

  • Конструктор по умолчанию не имеет формальных параметров, за исключением не внутреннего класса private, в котором конструктор по умолчанию неявно объявляет один формальный параметр, представляющий непосредственно включающий экземпляр класса ( §8.8. 1 , §15.9.2 , §15.9.3 ).

Что это означает, что ваш JavaFXSkel не имеет public no-arg конструктора, то есть NoSuchMethodException.


1. Не ожидайте, что новичок прочитал много, если таковые вообще имеются, JLS; Я просто предоставляю это как официальную ссылку.

0 голосов
/ 24 января 2019

Работает для меня, используя инструменты JDK 11.0.2 в Windows 10. Сделал одно изменение в вашем исходном коде:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...