Как исправить Причина: java.lang.NullPointerException: требуется местоположение. JavaFX

Здравствуйте, после добавления maven в мой модуль JavaFX произошел сбой, и я не могу найти решение. Я действительно пробовал много решений из stackof, но ничего не работало. В моем методе start () intellij не может найти ресурс моего файла fxml, он всегда возвращает значение null, даже когда я создал другой файл fxml в том же каталоге. Это действительно странная ситуация, потому что, когда я использую CTRL+Click на файле second.fxml intellij, он правильно находит его. До мавена все работало.

Пытался:

- getClass().getResource("second.fxml")
- getClass().getClassLoader().getResource("second.fxml")
- System.out.println("Test  = "+Main.class.getClassLoader().getResource("second.fxml")); <- always null
- getClass().getClassLoader().getResource("src/java/sample/second.fxml")
And a lot of other combine with getClass().

Основной класс

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {


    @Override
    public void start(Stage primaryStage) throws Exception{
        System.out.println("Test  = "+Main.class.getClassLoader().getResource("second.fxml"));
        Parent root = FXMLLoader.load(getClass().getResource("second.fxml"));
        primaryStage.setTitle("Hello");
        primaryStage.setScene(new Scene(root, 800, 800));
        primaryStage.show();

    }


    public static void main(String[] args) {
        launch(args);
    }
}

класс FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane xmlns="http://javafx.com/javafx"
            xmlns:fx="http://javafx.com/fxml"
            fx:controller="pl.zar.fx.Controller"
            prefHeight="400.0" prefWidth="600.0">

</AnchorPane>

Класс контроллера

public class Controller {

@FXML
    public void onClickAddButton(ActionEvent event){}
}

И мой Мейвен пом

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>groupId</groupId>
    <artifactId>javafxapp</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>


    <dependencies> <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
    </dependency></dependencies>
</project>

Код ошибки:

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:498)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    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:498)
    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:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at pl.zar.fx.Main.start(Main.java:15)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    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.lambda$null$148(WinApplication.java:191)
    ... 1 more
Exception running application pl.zar.fx.Main

Я ожидал возврата моего шаблона fxml, но всегда получал NULL. ИЗМЕНИТЬ структуру проекта: структура проекта


person Jedyn    schedule 28.03.2019    source источник
comment
Покажите структуру вашего проекта.   -  person Sedrick    schedule 28.03.2019
comment
Возможный дубликат Что такое исключение NullPointerException и как его исправить?   -  person Sedrick    schedule 28.03.2019
comment
@Sedrick обновлен, я добавил jpg со структурой проекта   -  person Jedyn    schedule 28.03.2019


Ответы (2)


Я бы рекомендовал поместить ваши fxml файлы в папку resources и использовать следующий код для их вызова:

Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("second.fxml"));

Здесь важно то, что вам нужно переместить ваши fxml файлы в папку ресурсов. В противном случае это не сработает.

Также задокументировано в этом ответе.

person Nexonus    schedule 28.03.2019
comment
Я попробовал это решение, выдает ту же ошибку, также я попытался поместить fxml в src в main в java в другой пакет, дал полный путь, часть пути только имя fxml и т. д., но всегда возвращает NULL - person Jedyn; 28.03.2019

Хорошо, я решаю это: я переместил файлы fxml в ресурсы, как вы сказали, и переключился

Parent root = FXMLLoader.load(getClass().getResource("second.fxml"));

to

Parent root = FXMLLoader.load(Main.class.getClassLoader().getResource("second.fxml"));

Теперь работает хорошо, я не знаю, почему я должен использовать ссылки на основной класс. До добавления maven framework все было хорошо.

person Jedyn    schedule 28.03.2019
comment
пожалуйста, прочтите API-документ для class.getResource и classLoader.getResource: они различаются тем, где они ищут ресурс. - person kleopatra; 28.03.2019