JavaFX启动窗口报错java.lang.IllegalStateException: Location未设置
JavaFX FXML文件加载失败(getResource返回null)问题排查与解决
我正在使用纯Eclipse IDE开发JavaFX客户端-服务端程序,项目结构如下:
问题代码
LoginController中用于打开窗口的代码:
public void start(Stage primaryStage) throws IOException { FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/login.fxml")); System.out.println(getClass().getResource("/fxml/login.fxml")); Parent root = loader.load(); Scene scene = new Scene(root); primaryStage.setTitle("EasyFit login"); primaryStage.setScene(scene); primaryStage.setResizable(false); primaryStage.show(); }
错误信息
控制台输出getResource结果为null,同时抛出以下异常:
null Exception in Application start method java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1082) Caused by: java.lang.RuntimeException: Exception in Application start method at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.IllegalStateException: Location is not set. at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2459) at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435) at client.gui.controllers.LoginController.start(LoginController.java:105) at client.ClientUI.start(ClientUI.java:29) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174) ... 1 more Exception running application client.ClientUI
已尝试使用/、../、无/或完整路径等写法均无效,寻求解决方案。
解决方案
1. 确认FXML文件的编译输出路径
- 右键项目 → Properties → Java Build Path → Source标签,检查
client源文件夹的输出目录是否正确(默认是bin或target/classes) - 确保编译后,
fxml文件夹及其内容被复制到类路径根目录下(即编译输出目录中存在/fxml/login.fxml)
2. 正确使用类路径资源引用
根据LoginController的包路径client.gui.controllers,有两种有效引用方式:
- 绝对路径(推荐):从类路径根目录开始查找,使用
getClass().getResource("/fxml/login.fxml") - 相对路径:从当前类的包目录往上回溯,使用
getClass().getResource("../../fxml/login.fxml")(两级回溯到类路径根,再定位fxml文件夹)
3. 验证FXML文件的实际位置与命名
- 确认
fxml文件夹确实位于client源文件夹的根目录下,而非嵌套在其他子文件夹中 - 检查文件名大小写(Java类路径资源区分大小写,确保
login.fxml拼写完全匹配)
4. 清理并重建项目
- 执行Eclipse菜单:Project → Clean...,选择当前项目进行清理
- 重新执行Build Project,确保所有资源文件被正确复制到编译输出目录
内容的提问来源于stack exchange,提问作者Din Salman
相关产品推荐
相关产品推荐

