web-dev-qa-db-fra.com

InvocationTargetException lors de l'exécution d'un programme javafx

Donc, cela a fonctionné dans l'exemple de javafx quand Mon pc avait jdk 1.7.0, donc cela pourrait être la nouvelle version de FX en Java8 cependant;

Je reçois une belle trace de pile

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

essentiellement en me disant que quelque chose ne va pas ici "com/rpg/gui/main.fxml:11"

et cette ligne est

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

donc je peux comprendre que ça n'aime pas quelque chose à voir avec le contrôleur principal, donc ça doit être quelque chose à voir avec le chargement du fxml et du contrôleur, n'est-ce pas? mais c'est à peu près là où finissent mes idées

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

c'est la méthode qu'il jette dans n'importe qui expérimenté dans javaFX ou sait des changements dans Java8 qui feraient ceci ??

17

Votre MainController n'a pas de constructeur à zéro argument. Si la variable FXMLLoader rencontre un attribut fx:controller sur l'élément racine, elle tente de créer une instance de ce contrôleur en appelant (de manière effective) le constructeur à argument zéro de la classe spécifiée dans l'attribut.

Pour résoudre ce problème (le moyen le plus simple), supprimez l'attribut fx:controller du fichier FXML , et définissez le contrôleur "à la main" sur la FXMLLoader. Vous devez créer une instance FXMLLoader au lieu de vous appuyer sur la méthode statique load(...):

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

J'ai fait face au même problème et je veux partager un peu le sujet. J'utilise Java 8 et Netbeans 8.1 et lorsque j'ai créé une application javafx FXML, je l'ai obtenue.
Voici quelques conseils:

  1. Lorsque vous créez un nouveau projet nettoyez et construisez votre projet avant d’essayer de le lancer.
  2. Si vous renommez un fichier (contrôleur, fxml) IDE, n'appliquez pas les modifications apportées aux autres fichiers. Netbeans au moins ne le fait pas. Donc, vous devez modifier ces noms de fichiers dans d'autres fichiers manuellement. 
  3. Vous pouvez définir le contrôleur dans le fichier fxml ou dans la main classe . Si vous souhaitez définir le contrôleur dans la classe main, utilisez la méthode décrite par @James_D . Si vous souhaitez définir dans le fichier fxml, utilisez l'attribut fx:controller comme

     fx:controller="yourProjectName.yourFXMLDocumentControllerName"
    

    et dans la classe principale référence comme

    Parent root = FXMLLoader.load(getClass().getResource("yourFXMLFileName.fxml"));
    
  4. Si vous pensez que tout est correct mais que vous obtenez toujours l'erreur nettoyez et construisez à nouveau votre projet et essayez de l'exécuter.

J'espère que cela aiderait quelqu'un.

3
Inzimam Tariq IT

Je rencontre aussi souvent cela ... Il semble y avoir un bogue dans Scenebuilder/netbeans 8, qui, lors de la sauvegarde dans Scenebuilder, crée un autre xmlns: fx = "...", ce qui peut poser problème ...

En outre, en regardant les fichiers fxml que j’utilise avec Java8, j’ai les informations suivantes: Xmlns = "http://javafx.com/javafx/8" xmlns: fx = "http://javafx.com/fxml/1"

où j'ai remarqué que le votre est: xmlns: fx = "http://javafx.com/fxml"

2
jdub1581

Vous avez utilisé

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

Essayer 

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

Pour tous ceux qui luttent avec JDK11/JavaFX11

La raison pour laquelle j'ai eu cette erreur est parce que le projet dépendait de Un module d'interface utilisateur qui contenait les références FXML et donc la configuration graphique . J'ai remarqué ces lignes dans le vidage du journal de compilation ci-dessous:

Causé par: Java.lang.IllegalAccessException: Class com.Sun.javafx.application.LauncherImpl (dans le module javafx.graphics) ne peut pas accéder à Class academy.learnprogramming.ui.Main (dans le module academy.learnprogramming.common ) parce que module academy.learnprogramming.common n'exporte pas academy.learnprogramming.ui dans le module javafx.graphics

Alors

En supposant que ceci ne soit PAS un projet maven, Nom du projet/nom du module/src/module-info.Java vous devez vous assurer que le système de modules a accès à tous vos modules du projet:

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
}

POUR RÉFÉRENCE:

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

Si Any One ne résout pas le problème en suivant les réponses, le moyen le plus simple est de créer une nouvelle classe vide fxml, puis cliquez sur edit du fichier fxml causant le problème et copiez le code xml dans la nouvelle classe. Accédez à la méthode start (), modifiez le:

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

à 

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