JavaFX中getClass().getResource()加载fxml抛出空指针异常
问题原因
你遇到的NullPointerException: Location is required报错,核心原因是getClass().getResource("hello-view.fxml")返回了null,控制台打印的URL = null已经证实了这点:JVM在运行时类路径下找不到对应的fxml文件,本质是IntelliJ没有把你放在源码目录下的fxml文件打包到运行时类路径中。
解决步骤
方案1(推荐,符合Java项目标准规范)
调整项目目录为标准结构,从根源避免资源找不到的问题:
- 在
src目录下新建main/java目录,右键该目录选择Mark Directory as -> Sources Root,将原有src/main/gui/MainMenu.java移动到src/main/java/main/gui/路径下 - 在
src目录下新建main/resources目录,右键该目录选择Mark Directory as -> Resources Root - 在resources目录下新建和包名匹配的层级目录
main/gui/,将hello-view.fxml移动到src/main/resources/main/gui/路径下 - 给启动类补充main方法(高版本JDK+JavaFX需要显式声明),优化后的代码如下:
package main.gui; 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 MainMenu extends Application { @Override public void start(Stage stage) throws Exception { URL url = getClass().getResource("hello-view.fxml"); if (url == null) { throw new RuntimeException("无法加载fxml资源,请检查资源目录配置"); } Parent root = FXMLLoader.load(url); Scene scene = new Scene(root,1920,1080); stage.setTitle("Hello!"); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } }
- 点击菜单栏
Build -> Rebuild Project重新构建项目后再运行即可。
方案2(不调整现有目录)
如果你不想改动现有文件位置:
- 右键
src/main/gui目录,选择Mark Directory as -> Resources Root,把当前存放fxml的目录标记为资源根目录 - 重新构建项目后运行即可。注意该方案会把gui目录下所有文件都当作资源处理,可能导致源码重复打包,仅适合临时测试使用。
注意:你原有代码中创建的第一个
FXMLLoader fxmlLoader = new FXMLLoader(...)实例没有被使用,属于冗余代码,可以直接删除。
内容的提问来源于stack exchange,提问作者DIEGO IGLESIAS
相关产品推荐
相关产品推荐

