InvocationTargetException when running a javafx program
So this worked in the example from javafx when My pc had jdk 1.7.0 so this may be the new version of FX in java8 however;
I get a nice stack-trace
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
basically telling me something is wrong here "com/rpg/gui/main.fxml:11"
and that line is
<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.rpg.gui.MainController">
so I can figure out that it doesn't like something to do with the main controller, so it has to be somthing to do with loading the fxml and the controller right? but thats about where my ideas end
MainController mainController = new MainController(path);
Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));
Window.setMainController(mainController);
Window.swap(path+"content.fxml");
that's the method it throws everything in anyone experienced in javaFX or know of any changes in java8 that'd do this??
Solution 1:
Your MainController
doesn't have a zero-argument constructor. If the FXMLLoader
encounters a fx:controller
attribute on the root element, it attempts to create an instance of that controller by (effectively) calling the zero-argument constructor of the class specified in the attribute.
To fix this (the simplest way), remove the fx:controller
attribute from the FXML file, and set the controller "by hand" on the FXMLLoader
. You need to create an FXMLLoader
instance instead of relying on the static load(...)
method:
FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
loader.setController(new MainController(path));
Pane mainPane = loader.load();
Solution 2:
I faced the same problem and want to share a little bit related to it. I'm using java 8 and Netbeans 8.1 and when I created a javafx FXML Application I got this one.
Here are some tips:
- When you create new project clean and build your project before you try to run.
- If you rename any file (controller, fxml) IDE do not apply changes to other files at least Netbeans is not doing so. So, you have to change those file names in other files manually.
-
You can define controller either in
fxml
file or inmain
class. If you want to define controller inmain
class use the method described by @James_D. If you want to define infxml
file than usefx:controller
attribute asfx:controller="yourProjectName.yourFXMLDocumentControllerName"
and in main class reference it as
Parent root = FXMLLoader.load(getClass().getResource("yourFXMLFileName.fxml"));
- If you think everything is correct but you still getting the error clean and build your project again and try to run.
Hope it would help someone.
Solution 3:
You used
Pane mainPane = FXMLLoader.load(getClass().getResource("main.fxml"));
Try
Pane mainPane = FXMLLoader.load(getClass().getResource("/main.fxml"));
Solution 4:
I also encounter that a lot... There seems to be a bug in Scenebuilder/netbeans 8, where upon saving in Scenebuilder, it creates another xmlns:fx="..." so that may be an issue...
Also, looking at fxml's i have using java8, I have these: xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
where I noticed your's is: xmlns:fx="http://javafx.com/fxml"