扩展应用程序的扩展会引发InvocationTargetException

时间:2018-10-09 01:46:57

标签: java javafx abstract-class java-10

我正在一个项目中,该项目将具有许多具有相似但足够不同的功能的JavaFX应用程序,因此我制作了一个抽象基类,该基类扩展了Application以处理通用功能并指示它们需要做什么,以及一堆扩展该类的具体类。但是,当我尝试跑步时,我得到了

  

应用程序构造函数中的异常   java.lang.reflect.InvocationTargetException       在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)       在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)       在java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)       在java.base / java.lang.reflect.Method.invoke(Method.java:564)       在javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:473)       在javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:372)       在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)       在java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)       在java.base / 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:无法构造应用程序实例:类toolBase.Tool       在javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:963)       在javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:198)       在java.base / java.lang.Thread.run(Thread.java:844)   造成原因:java.lang.InstantiationException       在java.base / jdk.internal.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java: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.lambda$runLater$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 :(得分:2)

您不应在基类中使用public static void main(String[] args)。每个扩展类都需要包含自己的相同方法的副本。

在基类中执行此操作会使JavaFX尝试启动Tool类的副本,这显然是行不通的,因为它是抽象的。