it-swarm.com.ru

InvocationTargetException при запуске программы javafx

Так что это сработало в примере с javafx, когда у моего компьютера был jdk 1.7.0, так что это может быть новая версия FX в Java8;

Я получаю хороший стэк-след

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

в основном говорит мне, что здесь что-то не так "com/rpg/gui/main.fxml:11"

и эта линия

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

так что я могу понять, что ему не нравится что-то делать с основным контроллером, так что это должно быть что-то, что связано с загрузкой fxml и контроллера, верно? но вот где мои идеи заканчиваются

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

это метод, который бросает все, кто имеет опыт работы с javaFX или знает о любых изменениях в Java8, которые могли бы это сделать ??

17
Matthew Optional Meehan

Ваш MainController не имеет конструктора с нулевым аргументом. Если FXMLLoader встречает атрибут fx:controller в корневом элементе, он пытается создать экземпляр этого контроллера путем (эффективно) вызова конструктора с нулевым аргументом класса, указанного в атрибуте.

Чтобы это исправить (самый простой способ), удалите атрибут fx:controller из файла FXML и установите контроллер «вручную» на FXMLLoader. Вам нужно создать экземпляр FXMLLoader вместо того, чтобы полагаться на статический метод load(...):

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

Я столкнулся с той же проблемой и хочу немного рассказать о ней. Я использую Java 8 и Netbeans 8.1, и когда я создал приложение javafx FXML, я получил это.
Вот несколько советов:

  1. Когда вы создаете новый проект очистите и соберите ваш проект, прежде чем пытаться запустить.
  2. Если вы переименуете какой-либо файл (controller, fxml) IDE, не применяйте изменения к другим файлам, по крайней мере, Netbeans этого не делает. Таким образом, вы должны изменить эти имена файлов в других файлах вручную. 
  3. Вы можете определить контроллер в файле fxml или в классе main . Если вы хотите определить контроллер в классе main, используйте метод, описанный в @James_D . Если вы хотите определить в файле fxml, используйте атрибут fx:controller как

     fx:controller="yourProjectName.yourFXMLDocumentControllerName"
    

    и в основном классе ссылаться на него как

    Parent root = FXMLLoader.load(getClass().getResource("yourFXMLFileName.fxml"));
    
  4. Если вы думаете, что все правильно, но вы все еще получаете ошибку очистите и соберите ваш проект снова и попробуйте запустить.

Надеюсь, это поможет кому-то.

3
Inzimam Tariq IT

Я также часто сталкиваюсь с этим ... Кажется, есть ошибка в Scenebuilder/netbeans 8, когда при сохранении в Scenebuilder он создает еще один xmlns: fx = "...", так что это может быть проблемой ...

Кроме того, глядя на fxml, которые у меня есть с использованием Java8, у меня есть эти: Xmlns = "http://javafx.com/javafx/8" xmlns: fx = "http://javafx.com/fxml/1"

где я заметил, что у вас есть: xmlns: fx = "http://javafx.com/fxml"

2
jdub1581

Ты использовал

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

Пытаться 

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

Для тех, кто борется с JDK11/JavaFX11

Причина, по которой я получил эту ошибку, заключается в том, что проект зависел от Модуля пользовательского интерфейса, который содержал ссылки на FXML и, следовательно, графическую конфигурацию . Я заметил эти строки в дампе журнала компиляции ниже:

Вызывается: Java.lang.IllegalAccessException: Класс com.Sun.javafx.application.LauncherImpl (в модуле javafx.graphics) не может получить доступ Класс academy.learnprogramming.ui.Main (в модуле academy.learnprogramming.common) ) , потому что модуль academy.learnprogramming.common не экспортирует academy.learnprogramming.ui в модуль javafx.graphics

Так

Предполагая, что это НЕ проект maven, Project/module-name/src/module-info.Java вам нужно было убедиться, что система модулей имеет доступ ко всем вашим модулям в проекте:

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
}

Для справки:

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

Если кто-то не решит проблему, следуя ответам, простой способ - создать новый пустой класс fxml, затем нажать edit fxml, вызывающего проблему, и скопировать код xml в новый класс. Перейти к методу start (), измените:

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

в 

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