JavaFX报Exception in Application start method错误排查与解决
Java错误日志通用阅读方法
- 优先定位最末尾的
Caused by块:Java异常采用嵌套抛出机制,日志最开头的大段栈信息都是JDK、JavaFX框架的上层调用包装,最后一条Caused by记录的才是触发崩溃的根本原因,不需要逐行啃最开头的异常栈。 - 快速定位自有代码的出错位置:栈追踪里每一条记录都会标注触发调用的类、方法、代码行号,找到带自己项目包名(比如本次的
com.example.speedreading)的记录,就能直接对应到你写的代码的出错行,本次报错明确指向HelloApplication.java:15,也就是你写的图标加载那一行。 - 直接读根因的异常描述:根因异常类名后面跟着的短句就是问题的直接说明,本次根因描述为
Invalid URL or resource not found,意思是传入的资源路径无效、找不到对应文件。 - 跳过框架和JDK内部的调用记录:所有以
java.base/、javafx.graphics/开头的栈记录都是官方代码的内部调用链路,除非你确认是框架本身的bug,否则不需要在这些行上浪费时间。
本次JavaFX窗口图标加载报错修复方案
问题原因
你在第15行写的Image icon = new Image("mb.png");直接传入了文件名作为参数,JavaFX的Image构造器默认会把传入的字符串当作外部文件路径或者网络URL解析,不会自动读取项目类路径下打包的资源文件,因此找不到mb.png触发报错。
修复代码
和你加载hello-view.fxml的逻辑保持一致,先通过类加载器获取资源的合法URL,再传入Image构造器,替换原有图标加载行即可:
// 原代码:Image icon = new Image("mb.png"); // 替换为: Image icon = new Image(HelloApplication.class.getResource("mb.png").toString());
注意事项
- 确保
mb.png文件和hello-view.fxml放在同一个资源目录下,也就是编译后和HelloApplication.class处于同层级路径,用上面的写法就能正常加载。 - 如果要把图标放在其他资源目录,需要写对类路径:比如把图标放在resources根目录的
img文件夹下,路径就要写成HelloApplication.class.getResource("/img/mb.png").toString(),开头的/代表类路径的根目录。 - 如果IntelliJ构建后依然找不到资源,右键项目的resources目录,选择
Mark Directory as -> Resources Root,确保构建时资源文件会被正确拷贝到输出目录。
内容的提问来源于stack exchange,提问作者therealfriendly
相关产品推荐
相关产品推荐

