Java 扩展应用程序的扩展将抛出InvocationTargetException

Java 扩展应用程序的扩展将抛出InvocationTargetException,java,javafx,abstract-class,java-10,Java,Javafx,Abstract Class,Java 10,我正在从事一个项目,该项目将有许多具有相似但不同功能的JavaFX应用程序,因此我创建了一个抽象基类来扩展应用程序,以处理常见功能并指定它们需要执行的操作,以及一组扩展该类的具体类。然而,当我尝试跑步时,我会 应用程序构造函数中的异常 java.lang.reflect.InvocationTargetException 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 位于java.base/jdk.

我正在从事一个项目,该项目将有许多具有相似但不同功能的JavaFX应用程序,因此我创建了一个抽象基类来扩展应用程序,以处理常见功能并指定它们需要执行的操作,以及一组扩展该类的具体类。然而,当我尝试跑步时,我会

应用程序构造函数中的异常 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.LaunchImpl.launchApplicationWithArgs(LaunchImpl.java:473) 位于javafx.graphics/com.sun.javafx.application.LaunchImpl.launchApplication(LaunchImpl.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.launchelper$FXHelper.main(launchelper.java:941) 原因:java.lang.RuntimeException:无法构造应用程序实例:类toolBase.Tool 位于javafx.graphics/com.sun.javafx.application.LaunchImpl.launchApplication1(LaunchImpl.java:963) 在javafx.graphics/com.sun.javafx.application.LaunchImpl.lambda$launchApplication$2(LaunchImpl.java:198) 位于java.base/java.lang.Thread.run(Thread.java:844) 原因:java.lang.InstanceionException 位于java.base/jdk.internal.reflect.InstanceExceptionConstructorAccessorImpl.newInstance(InstanceExceptionConstructorAccessorImpl.java:48) 位于java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488) 在javafx.graphics/com.sun.javafx.application.launchempl.lambda$launchApplication1$8(launchempl.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.invokelateDispatcher$Future.run(invokelateDispatcher.java:96) 在javafx.graphics/com.sun.glass.ui.win.WinApplication.\u runLoop(本机方法) 位于javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175) ... 还有一个 运行应用程序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;
}
}

所有的依赖关系和一切都很好。当我让它们扩展应用程序并从基类复制公共功能时,它们运行得非常好。有人知道发生了什么吗?

基类中不应该有
公共静态void main(String[]args)
。每个扩展类都需要包含同一方法的自己的副本


在基类中这样做会导致JavaFX尝试启动
工具
类的副本,这显然不起作用,因为它是抽象的。

啊,这很有意义。谢谢@但是,JTDotz不太确定你正在实现什么。我希望您知道,在一个JVM实例中只能运行一个JavaFX
应用程序的一个实例。我的整个项目结构是错误的。