it-swarm.com.de

InvocationTargetException beim Ausführen eines Javafx-Programms

Das funktionierte im Beispiel von javafx, als My pc jdk 1.7.0 hatte. Dies könnte jedoch die neue Version von FX in Java8 sein;

Ich bekomme eine schöne Stack-Spur

jfx-project-run:
Executing E:\workspace\PathFinderApp\dist\run1095471771\PathFinderApp.jar using platform C:\Program Files\Java\jdk1.8.0\jre/bin/Java
Exception in Application start method
Java.lang.reflect.InvocationTargetException
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:483)
    at com.Sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.Java:367)
    at com.Sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.Java:305)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:483)
    at Sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.Java:767)
Caused by: Java.lang.RuntimeException: Exception in Application start method
    at com.Sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.Java:894)
    at com.Sun.javafx.application.LauncherImpl.access$000(LauncherImpl.Java:56)
    at com.Sun.javafx.application.LauncherImpl$1.run(LauncherImpl.Java:158)
    at Java.lang.Thread.run(Thread.Java:744)
Caused by: javafx.fxml.LoadException: 
file:/E:/workspace/PathFinderApp/dist/run1095471771/PathFinderApp.jar!/com/rpg/gui/main.fxml:11

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.Java:2617)
    at javafx.fxml.FXMLLoader.access$700(FXMLLoader.Java:104)
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.Java:937)
    at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.Java:976)
    at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.Java:216)
    at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.Java:738)
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.Java:2723)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:2527)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:3230)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:3191)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:3164)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:3140)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.Java:3120)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.Java:3113)
    at com.rpg.gui.GUI.loadMainPane(GUI.Java:34)
    at com.rpg.gui.GUI.initialize(GUI.Java:20)
    at Main.start(Main.Java:20)
    at com.Sun.javafx.application.LauncherImpl$8.run(LauncherImpl.Java:837)
    at com.Sun.javafx.application.PlatformImpl$7.run(PlatformImpl.Java:335)
    at com.Sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.Java:301)
    at com.Sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.Java:298)
    at Java.security.AccessController.doPrivileged(Native Method)
    at com.Sun.javafx.application.PlatformImpl$6.run(PlatformImpl.Java:298)
    at com.Sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.Java:95)
    at com.Sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.Sun.glass.ui.win.WinApplication.access$300(WinApplication.Java:39)
    at com.Sun.glass.ui.win.WinApplication$4$1.run(WinApplication.Java:112)
    ... 1 more
Caused by: Java.lang.InstantiationException: com.rpg.gui.MainController
    at Java.lang.Class.newInstance(Class.Java:418)
    at Sun.reflect.misc.ReflectUtil.newInstance(ReflectUtil.Java:51)
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.Java:932)
    ... 26 more
Caused by: Java.lang.NoSuchMethodException: com.rpg.gui.MainController.<init>()
    at Java.lang.Class.getConstructor0(Class.Java:2971)
    at Java.lang.Class.newInstance(Class.Java:403)
    ... 28 more
Exception running application Main
Java Result: 1

grundsätzlich sagt mir, dass hier etwas nicht stimmt "com/rpg/gui/main.fxml:11"

und diese Linie ist

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.rpg.gui.MainController">

ich kann also herausfinden, dass es etwas nicht gefällt, was mit dem Hauptcontroller zu tun hat. Es muss also etwas mit dem Laden der fxml und des Controllers zu tun haben, richtig? Aber das ist, wo meine Ideen enden

MainController mainController = new MainController(path);
Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));
Window.setMainController(mainController);
Window.swap(path+"content.fxml");

das ist die Methode, die alle in JavaFX erfahrenen Personen in Erfahrung bringen oder Änderungen in Java8 kennen, die dies tun würden.

Ihre MainController hat keinen Konstruktor mit null Argumenten. Wenn FXMLLoader ein fx:controller-Attribut im Root-Element feststellt, versucht es, eine Instanz dieses Controllers zu erstellen, indem (effektiv) der Zero-Argument-Konstruktor der im Attribut angegebenen Klasse aufgerufen wird.

Um dies zu beheben (den einfachsten Weg), entfernen Sie das fx:controller-Attribut aus der FXML-Datei und setzen Sie den Controller "von Hand" auf die FXMLLoader. Sie müssen eine FXMLLoader-Instanz erstellen, anstatt sich auf die statische load(...)-Methode zu verlassen:

FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
loader.setController(new MainController(path));
Pane mainPane = loader.load();
16
James_D

Ich war mit dem gleichen Problem konfrontiert und möchte etwas dazu sagen. Ich verwende Java 8 und Netbeans 8.1 und als ich eine javafx FXML-Anwendung erstellte, bekam ich diese.
Hier sind einige Tipps:

  1. Beim Erstellen eines neuen Projekts clean und build Ihres Projekts, bevor Sie versuchen, es auszuführen.
  2. Wenn Sie eine Datei umbenennen (Controller, fxml) IDE, nehmen Sie keine Änderungen an anderen Dateien vor, zumindest tut dies Netbeans nicht. Daher müssen Sie diese Dateinamen in anderen Dateien manuell ändern. 
  3. Sie können den Controller entweder in der fxml-Datei oder in der main-Klasse ..__ definieren. Wenn Sie den Controller in der main-Klasse definieren möchten, verwenden Sie die von @James_D beschriebene Methode. Wenn Sie in fxml-Datei definieren möchten, verwenden Sie das fx:controller-Attribut als

     fx:controller="yourProjectName.yourFXMLDocumentControllerName"
    

    und in der Hauptklasse verweisen sie auf

    Parent root = FXMLLoader.load(getClass().getResource("yourFXMLFileName.fxml"));
    
  4. Wenn Sie denken, dass alles in Ordnung ist, erhalten Sie dennoch den Fehler clean and build Ihr Projekt erneut und versuchen Sie, es auszuführen.

Ich hoffe es würde jemandem helfen.

3

Ich stoße auch viel darauf ... Es scheint einen Fehler in Scenebuilder/netbeans 8 zu geben, bei dem beim Speichern in Scenebuilder ein anderes xmlns erstellt wird: fx = "...", so dass dies ein Problem sein könnte ...

Wenn ich mir fxmls anschaue, habe ich Java8 verwendet, habe ich folgende: Xmlns = "http://javafx.com/javafx/8" xmlns: fx = "http://javafx.com/fxml/1"

wo ich bemerkt habe, dass Ihr ist: xmlns: fx = "http://javafx.com/fxml"

2
jdub1581

Du hast benutzt

Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));

Versuchen 

Pane mainPane = FXMLLoader.load(getClass().getResource("/main.fxml"));
2
idzik78

Für alle, die mit JDK11/JavaFX11 zu kämpfen haben

Der Grund für diese Fehlermeldung war, dass das Projekt von einem UI-Modul abhängig war, das die FXML-Referenzen und somit die Grafikkonfiguration enthielt. Ich habe diese Zeilen im Kompilierungsprotokollauszug bemerkt:

Ursache: Java.lang.IllegalAccessException: Class com.Sun.javafx.application.LauncherImpl (im Modul javafx.graphics) kann nicht auf Class academy.learnprogramming.ui.Main (im Modul academy.learnprogramming.common. Zugreifen ) weil das Modul academy.learnprogramming.common academy.learnprogramming.ui nicht in das Modul javafx.graphics exportiert

So

Angenommen, dies ist KEIN Maven-Projekt, Project/Modulname/src/module-info.Java, um sicherzustellen, dass das Modulsystem Zugriff auf alle Ihre Module im Projekt hat:

module com.test.common {

    requires javafx.fxml;
    requires javafx.controls;
    requires javafx.graphics;
    requires Java.sql;
    // ... etc.



    opens com.test.common;
    opens com.test.ui;        // For my particular case, I had Forgotten this one
    opens com.test.db;        // And this one
}

ALS REFERENZ:

Exception in Application constructor
Exception in thread "main" 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:566)
    at Java.base/Sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.Java:1051)
Caused by: Java.lang.RuntimeException: Unable to construct Application instance: class academy.learnprogramming.ui.Main
    at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.Java:890)
    at javafx.graphics/com.Sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.Java:195)
    at Java.base/Java.lang.Thread.run(Thread.Java:834)
Caused by: Java.lang.IllegalAccessException: class com.Sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class academy.learnprogramming.ui.Main (in module academy.learnprogramming.common) because module academy.learnprogramming.common does not export academy.learnprogramming.ui to module javafx.graphics
    at Java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.Java:361)
    at Java.base/Java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.Java:591)
    at Java.base/Java.lang.reflect.Constructor.newInstance(Constructor.Java:481)
    at javafx.graphics/com.Sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.Java:802)
    at javafx.graphics/com.Sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.Java:455)
    at javafx.graphics/com.Sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.Java:428)
    at Java.base/Java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.Sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.Java:427)
    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:174)
    ... 1 more
1
Chrips

Wenn Any One das Problem nicht durch Antworten behebt, können Sie die neue fxml Empty-Klasse erstellen. Klicken Sie dazu in der Datei fxml auf edit und kopieren Sie den XML-Code in die neue Klasse. Gehe zur start () - Methode und ändere die:

Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));

zu 

Pane mainPane = FXMLLoader.load(getClass().getResource("newClass.fxml"));
0
Abderrahmane