JAVAFX - исключение, вызванное местоположением, не установлено при загрузке файла fxml

Я пытаюсь интегрировать файл fxml в свой проект, используя следующий код:

final FXMLLoader fxmlLoader =
            new FXMLLoader(this.getClass().getResource("/sample.fxml"));

Parent root = (Parent) fxmlLoader.load();

Программа вылетает на второй строке, выбрасывая это исключение,

Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:875)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$147(LauncherImpl.java:157)
    at com.sun.javafx.application.LauncherImpl$$Lambda$1/1199823423.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3201)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3169)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3142)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3118)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3098)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3091)
    at FileActions.start(FileActions.java:42)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$153(LauncherImpl.java:821)
    at com.sun.javafx.application.LauncherImpl$$Lambda$51/970544503.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$166(PlatformImpl.java:323)
    at com.sun.javafx.application.PlatformImpl$$Lambda$47/1878510174.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$164(PlatformImpl.java:292)
    at com.sun.javafx.application.PlatformImpl$$Lambda$49/1792840102.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(PlatformImpl.java:291)
    at com.sun.javafx.application.PlatformImpl$$Lambda$48/1671111378.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)

Process finished with exit code 130

введите описание изображения здесь Я также пытался использовать точный путь (используя путь копирования), но все равно получал ту же ошибку.

Также пытался,

Parent root = FXMLLoader.load(getClass().getResource("../resources/sample.fxml"));
//and
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));

а также положить его в ту же папку с моими java-файлами, но ничего не работает...

Не знаю, актуально ли это, но вот мой файл iml,

    <?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
    <output url="file://$MODULE_DIR$/target/classes" />
    <output-test url="file://$MODULE_DIR$/target/test-classes" />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
      <excludeFolder url="file://$MODULE_DIR$/target" />
    </content>
    <orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="module-library" scope="TEST">
      <library name="JUnit4">
        <CLASSES>
          <root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.12.jar!/" />
          <root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-core-1.3.jar!/" />
        </CLASSES>
        <JAVADOC />
        <SOURCES />
      </library>
    </orderEntry>
    <orderEntry type="library" exported="" name="commons-net-3.6" level="project" />
    <orderEntry type="library" exported="" name="hamcrest-core-1.3" level="project" />
    <orderEntry type="library" exported="" name="junit-4.12" level="project" />
  </component>
</module>

Что вызывает это и как я могу это исправить?

Вот архив моего проекта, если кто-то захочет взглянуть< /а>.

Спасибо,

Генри


person shjnlee    schedule 07.08.2017    source источник
comment
Убедитесь, что файл FXML развертывается в папке сборки.   -  person James_D    schedule 07.08.2017
comment
Удалить начальный '/'   -  person Rawnald Gregory Erickson    schedule 07.08.2017
comment
@RawnaldGregoryErickson: я пробовал, но все равно не работает :(   -  person shjnlee    schedule 07.08.2017
comment
@James_D как я мог это сделать?   -  person shjnlee    schedule 07.08.2017
comment
@shjnlee Просто откройте файловый браузер (Finder на Mac или Windows Explorer — или как там он называется в наши дни — в Windows и т. д.) и посмотрите, где находится папка сборки (т. е. папка, которая является корнем, где находятся .class файлы генерируются - build, или bin, или target/classes, или что-то еще - это зависит от вашей IDE и ваших настроек).   -  person James_D    schedule 07.08.2017


Ответы (2)


Я вижу, вы используете maven и jetbrains. Это исключение действительно возникает, когда местоположение файла fxml в коде неверно. Вы используете мавен. Maven ищет ресурсы (например, файлы fxml) в своей папке ресурсов. Корневая папка проекта maven находится там, где находится pom.xml. Я буду ссылаться на него как {mavenRoot}. Итак, предположим, что ваш файл fxml находится по этому пути:

{mavenRoot}/src/main/resources/fxml/sample.fxml

Затем вы можете использовать эти две строки для настройки загрузчика fxml:

FXMLLoader loader1 = new FXMLLoader();
loader1.setLocation(getClass().getResource("/fxml/sample.fxml"));

В проекте maven getResource() будет искать папку {mavenRoot}/src/main/resources.

person Chase    schedule 07.08.2017
comment
Странно, что, несмотря на то, что iml сказал, что это проект maven, я не смог найти pom.xml нигде в своем проекте (я мог настроить что-то при создании проекта, чего я точно не помню). в любом случае, я попробовал эту строку кода и запустил loader1.load() и получил сбой прямо в этом месте с этим исключением: Вызвано: java.lang.IllegalStateException: Местоположение не установлено. в javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2428) в javafx.fxml.FXMLLoader.load(FXMLLoader.java:2403) - person shjnlee; 07.08.2017
comment
Проверьте это: stackoverflow.com /вопросы/17228487/ - person Chase; 07.08.2017
comment
Я погуглил и попробовал предложение в этом посте, но это не сработало. функция getResources почему-то всегда возвращает null. - person shjnlee; 07.08.2017
comment
@shjnlee Попробуйте следующее: в своей среде IDE создайте новый проект FXML. Я никогда не использовал JetBreans IDE, но у Netbeans есть новый проект FXML. Поэтому, когда он создается в вашей среде, он должен иметь рабочий пример FXMLLoader. Проверьте структуру и метод этого вновь созданного проекта. Надеюсь, это поможет! На самом деле это то, что я сделал в Netbeans, когда у меня была такая же проблема. Также убедитесь, что ваш файл FXML действителен и не содержит ошибок. Это также может быть проблемой. - person Chase; 07.08.2017
comment
странно, что в новом проекте он работает нормально, и я следил за тем, чтобы все структуры были похожи, но этот проект продолжает получать NULL при попытке получить файл ресурсов. Я отредактировал свой пост и добавил свой проект (я удалил другие свои коды, поэтому теперь он загружает только fxml). Вы не против помочь мне взглянуть? Спасибо. - person shjnlee; 07.08.2017
comment
Я создал новый проект, и проблема исправлена. Спасибо. - person shjnlee; 08.08.2017

Ошибка указывает на то, что файл fxml загружается из неправильного места. getClass().getResource загружает ресурс, который соответствует спецификации Java для ресурса идентифицируется строкой, состоящей из последовательности подстрок, разделенных символом (/), за которым следует имя ресурса. Каждая подстрока должна содержать действительный идентификатор Java. Нет настоящей гарантии разрешения ресурсов с помощью .., так как это недействительный идентификатор.
Я предполагаю, что вы не используете структуру папок Maven, поэтому я бы предложил просто сохранить файл fxml в том же пакете, что и класс Java. который запускает его и устанавливает путь, например "sample.fxml" Что вы видите при выводе getClass().getClassLoader().getResource("sample.fxml")
Также убедитесь, что ваше имя файла совпадает с именем ресурса, без пробелов до или после - вы можете переименовать и проверить пробелы, если они есть.

person Piyush Mattoo    schedule 07.08.2017
comment
Спасибо за ваш ответ. Я забыл включить тот тест, который я пробовал. Я пробовал это раньше, и сделал это снова, когда я прочитал ваш комментарий. Это не работает. будет ли что-нибудь важное в моем iml, что я могу испортить? Отредактирую свой пост для этого. - person shjnlee; 07.08.2017
comment
Итак, ваш класс fxml и Java был внутри пакета java? - person Piyush Mattoo; 07.08.2017
comment
Да, я поместил их в пакет java и вызвал getClass().getClassLoader().getResource(sample.fxml), но у меня все еще есть эта ошибка. - person shjnlee; 07.08.2017
comment
Я бы дважды проверил имя файла fxml, удалил --> скопировал содержимое --> вставил в новый файл FXML и назвал его правильно, совпадающим с именем, используемым в классе Java, загружающем его - person Piyush Mattoo; 07.08.2017