首页 文章

扩展Application的扩展会抛出InvocationTargetException

提问于
浏览
1

我正在开发一个项目,它将拥有大量具有相似但功能不同的JavaFX应用程序,因此我创建了一个抽象基类,它扩展了Application以处理常见功能并指示他们需要做什么,以及一堆具体的扩展那个的类 . 但是,当我尝试跑步时,我明白了

java.base / jdk.internal.refut中的java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)中的Application构造函数java.lang.reflect.InvocationTargetException中的异常.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) )在javafx.graphics/com的java.base / java.lang.reflect.Method.invoke(Method.java:564)的java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 . sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:473)位于java.base / jdk.internal.reflect的javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:372) . java.base / jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中的java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)中的NativeMethodAccessorImpl.invoke0(本机方法)at at ja的java.base / java.lang.reflect.Method.invoke(Method.java:564) va.base / sun.launcher.LauncherHelper $ FXHelper.main(LauncherHelper.java:941)引起:java.lang.RuntimeException:无法在javafx.graphics / com.sun.javafx构造Application实例:class toolBase.Tool . application.LauncherImpl.launchApplication1(LauncherImpl.java:963),位于java.base / java.lang.Thread.run的javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:198) (Thread.java:844)由java.base / java.lang.reflect.Constructor.newInstance中的java.base / jdk.internal.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)中的java.lang.InstantiationException引起(Constructor.java:488)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(Platf ormImpl.java:418)在javafx的javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417)的java.base / java.security.AccessController.doPrivileged(Native Method)中位于javafx.graphics/的javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native方法)的.graphics / com.sun.glass.ui.InvokeLaterDispatcher $ Future.run(InvokeLaterDispatcher.java:96) 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 回答

  • 2

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

    在基类中执行此操作会导致JavaFX尝试启动 Tool 类的副本,这显然不起作用,因为它是抽象的 .

相关问题