java - 扩展应用程序的扩展抛出 InvocationTargetException

标签 java javafx abstract-class java-10

我正在开发一个项目,该项目将包含许多具有相似但不同功能的 JavaFX 应用程序,因此我创建了一个抽象基类,它扩展了 Application 以处理通用功能并指示它们需要做什么,以及一个一堆扩展那个的具体类。但是,当我尝试运行时,我得到了

Exception in Application constructor 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:564) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:473) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:372) 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:564) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:941) Caused by: java.lang.RuntimeException: Unable to construct Application instance: class toolBase.Tool at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:963) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:198) at java.base/java.lang.Thread.run(Thread.java:844) Caused by: java.lang.InstantiationException at java.base/jdk.internal.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:875) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(PlatformImpl.java:449) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418) at java.base/java.security.AccessController.doPrivileged(Native Method) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175) ... 1 more Exception running application 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 并从基类复制通用功能时,它们运行完美。有谁知道这是怎么回事吗?

最佳答案

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

在基类中这样做会导致 JavaFX 尝试启动 Tool 类的副本,这显然是行不通的,因为它是抽象的。

关于java - 扩展应用程序的扩展抛出 InvocationTargetException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52712233/

相关文章:

java - Java应用程序表单外的快捷键

java - 连接到 Apple 推送通知服务器时发生 SSLHandshakeException

java - 我很难在 JavaFX 中调整某些元素的大小

java - 以有效的方式保存各种对象的 ArrayList

c++ - 允许派生类从基础抽象类实现单个纯虚函数

java - 抽象如何帮助隐藏 Java 中的实现细节?

java - 无效的 MidiData 异常 : command out of range

java - 使用maven指定特定的jar文件

java - 单击 JavaFX ListView 中的任意位置将返回索引 -1 并崩溃

java - 动态显示 DatePicker