Расположение NullPointer на JavaFX FXMLLoader

Я прочитал все вопросы об этом в stackoverflow, и я не использовал что-то, что сработало. У меня есть базовый fxml, созданный с использованием JavaFX Scene Builder 1.1 при использовании Java 1.7.

Я просто хочу загрузить файл ... но все, кажется, указывает на нулевое местоположение, что означает, что он не может его найти. Я не понимаю, почему. У меня есть 18 попыток/уловов, чтобы показать 18 различных возможностей для его работы, но он не может их найти. Эти примеры взяты из некоторых вопросов stackoverflow как «действительные принятые ответы». Что мне здесь не хватает? Все компилируется, поэтому я не думаю, что мне не хватает SDK или чего-то серьезного.

Журнал печатает от 1 до 18 с NullPointerException на 18-й попытке/улове, в котором говорится, что требуется местоположение NullPointer....

Просмотреть сообщение на imgur.com

введите здесь описание изображения

import javafx.application.Application;
import javafx.fxml.FXMLLoader;

import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.net.URL;


public class OptionsToggleMenu  extends Application {

public void launchTheThing(String... args){     //runs this on the Main application's main method.
    launch(args);
}

@Override
public void start(Stage primaryStage) {
    int failures = 0;

    try{
        Parent root1 = new Parent() {
        };
        try{
              root1 = FXMLLoader.load(getClass().getResource("AdventureLibrary/test.fxml"));
            System.out.println(null == root1);
        }
        catch(Exception e){
            System.out.println(1);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getClassLoader().getResource("AdventureLibrary/test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(2);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getResource("bin/test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(3);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getClassLoader().getResource("bin/test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(4);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getResource("test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(5);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getClassLoader().getResource("test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(6);
            failures++;
        }
        try{
              root1 = FXMLLoader.load(getClass().getResource("/AdventureLibrary/test.fxml"));
            System.out.println(null == root1);
        }
        catch(Exception e){
            System.out.println(7);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getClassLoader().getResource("/AdventureLibrary/test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(8);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getResource("/bin/test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(9);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getClassLoader().getResource("/bin/test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(10);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getResource("/test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(11);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getClassLoader().getResource("/test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(12);
            failures++;
        }
        try{
              root1 = FXMLLoader.load(getClass().getResource("/resources/test.fxml"));
            System.out.println(null == root1);
        }
        catch(Exception e){
            System.out.println(13);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getClassLoader().getResource("/resources/test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(14);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getResource("resources/test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(15);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getClassLoader().getResource("resources/test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(16);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getResource("test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(17);
            failures++;
        }

        try{
              Parent root2 = FXMLLoader.load(getClass().getClassLoader().getResource("/test.fxml"));
            System.out.println(null == root2);
        }
        catch(Exception e){
            System.out.println(18);
            System.out.println(e);
            failures++;
        }


        System.out.println("There are this many failures: " + failures+"/18");

    Scene scene = new Scene(root1, 300, 275);

    primaryStage.setTitle("FXML Welcome");
    primaryStage.setScene(scene);
    primaryStage.show();
    }
    catch(Exception e)
    {
        System.out.println("XX"+e);
    }
}


}

Изменить: добавление кода, который вызывает resources/fxml/test.fxml, также не увенчалось успехом. введите здесь описание изображения


person Jayizzle    schedule 25.02.2016    source источник
comment
Какова трассировка стека ошибки?   -  person purring pigeon    schedule 25.02.2016
comment
Какие из файлов test.fxml копируются в каталог развертывания и где они находятся в этой структуре каталогов?   -  person James_D    schedule 25.02.2016
comment
Никакая трассировка стека не печатается с уловом, за исключением простой печати java.lang.NullPointerException: Location is required.... эта ошибка возникает при 18-й попытке поймать, но если я заполню ее, я скажу, что ошибка для каждой попытки поймать выше.   -  person Jayizzle    schedule 25.02.2016
comment
@James_D, разве недостаточно разместить файлы test.fxml под именем проекта AdventureLibrary? Когда я нажимаю run-debug в IDEA, возникает эта проблема.   -  person Jayizzle    schedule 25.02.2016
comment
1. Он не печатает трассировку стека, потому что вы этого не просите. Замените System.out.println(e); на e.printStackTrace(); (хотя я не думаю, что это полезно...) 2. Я не очень хорошо знаком с IntelliJ, поэтому я не знаю точного поведения сборки, но дело в том, что файл fxml должен быть доступны во время выполнения. Все, что вы показываете, - это каталог исходного кода, который, очевидно, не имеет значения, если проблема заключается в том, что файл fxml не может быть найден во время выполнения. Как выглядит структура каталогов развертывания и где в ней находятся файлы fxml?   -  person James_D    schedule 25.02.2016
comment
Я нашел, где находится вывод сборки... и здесь нет файлов .fxml или более старых, кроме классов, которые я использую. Это неудобно, но я добавил файл .fxml, и теперь ошибки печатаются 14/18... так что по крайней мере 4 оператора try/catch сработали. Спасибо.   -  person Jayizzle    schedule 25.02.2016
comment
Вероятно, вам просто нужно очистить и пересобрать проект. Возможно, наличие нескольких файлов fxml с одним и тем же именем (и, возможно, нацеленных на одно и то же местоположение относительно пути к классу) сбивает с толку процесс сборки — я бы сократил его до одного, возможно, под src/resources, затем очистил и восстановить.   -  person James_D    schedule 25.02.2016


Ответы (2)


Чтобы полностью решить эту проблему, я взял сообщение James_D и проверил, как работает сборка IDEA для производства. Он не сохраняет файлы, если вы не скажете ему об этом. Есть несколько файлов по умолчанию, которые компилятор выведет в производство, например файлы .property и .jpg... но не файлы JavaFX, которые заканчиваются на .fxml.

Я следовал этому: https://www.jetbrains.com/idea/help/resource-files.html Мне удалось получить сборку для развертывания моего файла fxml после того, как я добавил ?*.fxml в конце строки компиляции для принятых файлов.

Спасибо, парни.

person Jayizzle    schedule 25.02.2016

Я думаю, вам нужно изменить эту строку:

root1 = FXMLLoader.load(getClass().getResource("AdventureLibrary/test.fxml"));

Я не думаю, что это правильный путь к вашему FXML. В моем проекте мы используем

resources
    ->fxml
        text.fxml

Загружаем так:

FXMLLoader loader = new FXMLLoader();
loader.load(Class.class.getClassLoader().getResource("fxml/text.fxml").openStream());
person purring pigeon    schedule 25.02.2016