Расширение расширения Application вызывает InvocationTargetException - PullRequest
0 голосов
/ 09 октября 2018

Я работаю над проектом, в котором будет много приложений JavaFX со схожей, но достаточно различной функциональностью, поэтому я создал абстрактный базовый класс, расширяющий Application для обработки общих функций и определяющий, что им нужно делать, икуча конкретных классов, которые расширяют этот.Тем не менее, когда я пытаюсь запустить, я получаю

Исключение в конструкторе приложения java.lang.reflect.InvocationTargetException в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в java.,.Method.invoke (Method.java:564) в javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:473) в javafx.graphics/com.sun.javafx.application.llaunchher(LauncherImpl.java:372) в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMetbasejjj)/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.base / java.lang.reflect.Method.invoke (Method.java:564) в java.base / sun.launcher.LauncherHelper $ FXHelper.main (LauncherHelper.java:941) Причина: java.lang.RuntimeException: Невозможно создать приложениеЭкземпляр: класс.java: 198) в java.base / java.lang.Thread.run (Thread.java:844). Вызывается: java.lang.InstantiationException в java.base / jdk.internal.reflect.InstantiationExceptionConstructorAccessorImpl.newInstanceExmpIstIst: 48) в java.base / java.lang.reflect.Constructor.newInstance (Constructor.java:488) в javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:875)в javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(PlatformImpl.java:449) в javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda $ runLater $ 9 (PlatformImpl.java:418) в java.base / java.security.AccessController.doPrivileged (собственный метод) в javafx.graphics/com.sun.javafx.application.PlatformImpl.lambdarunLater $ 10 (PlatformImpl.java:417) на javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) на javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop (собственный метод) по адресу javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175) ... еще 1 исключение при запуске приложения ccs.CCS

Это суть базового класса:

public abstract class Tool extends Application {
public CCS ccs;
public abstract String getLongName();
public abstract String getShortName();
public abstract String getVersion();

public void start(Stage primaryStage) {
    try {
        primaryStage.setTitle("[Company] " + getLongName() + " v" + getVersion());
        Scene scene = new Scene(build(primaryStage), 200, 100);
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public abstract Parent build(Stage stage);

public static void main(String[] args) {
    launch(args);
}

@Override public void stop() { ccs.openTools.remove(getLongName()); }
}  

И все расширения сейчас выглядят так:

public class ACT extends Tool {
public String getLongName() {return "[Tool name]"; }
public String getShortName() {return "ACT"; }
public String getVersion() {return "α.0";}

public Parent build(Stage stage) {
    BorderPane root = new BorderPane();

    Button b = new Button("Do "+getShortName()+" stuff");
    b.setOnMouseClicked((e) -> {
        System.out.println(getShortName()+" stuff");
    });
    root.setCenter(b);
    return root;
}
}

Все зависимости и все в порядке.Когда я вместо этого заставляю их расширять Application и копировать общие функциональные возможности из базового класса, они работают отлично.Кто-нибудь знает, что происходит?

1 Ответ

0 голосов
/ 09 октября 2018

Вы не должны иметь public static void main(String[] args) в базовом классе.Каждый расширяющий класс должен включать свою собственную копию того же метода.

Выполнение этого в базовом классе заставляет JavaFX попытаться запустить копию класса Tool, что, очевидно, не будет работать, потому что оно абстрактно.

...