如何修复原因:java.lang.NullPointerException:必需的位置。 JavaFX

时间:2019-03-28 11:52:08

标签: maven javafx

将maven添加到我的JavaFX模块后,您好崩溃了,找不到解决方法。我真的从stackof尝试了很多解决方案,但没有任何效果。在我的start()方法中,intellij找不到我的fxml文件的资源,当我在同一目录中创建其他fxml文件时,它也始终返回null。这真的很奇怪,因为当我使用CTRL +单击second.fxml intellij正确找到文件时。在Maven之前一切都在工作。

尝试:

- 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){}
}

还有我的Maven pom

<?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。 编辑项目结构: project structure

2 个答案:

答案 0 :(得分:0)

我建议将您的fxml文件放入resources文件夹中,并使用以下代码对其进行调用:

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

这里重要的是,您需要将fxml文件移动到资源文件夹中。否则它将无法正常工作。

也记录在this答案中。

答案 1 :(得分:0)

好吧,我解决了: 我按照您所说的将fxml文件移至资源并切换

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

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

现在工作良好,我不知道为什么我必须使用对Main类的引用。在添加Maven框架之前,一切都很好。