Java从resources目录加载图片时触发NullPointerException
报错根本原因
- 资源检索路径不匹配:Java类加载器的
getResource()方法从类路径根目录(即Maven/Java项目编译构建后,src/main/resources下的所有内容会直接对齐到类路径根层级)开始查找资源。当前代码传入的检索参数是"foggedTile.png",而实际图片存储在类路径根下的minesweeper/子目录中,类加载器无法定位到目标文件,直接返回null。
常见的路径错误写法还包括:带开头斜杠的"/minesweeper/foggedTile.png"、带src目录前缀的"src/main/resources/minesweeper/foggedTile.png",这两类写法都会直接导致资源找不到。 - 空指针触发链路:因为
getResource()返回了null值,后续代码直接对该返回值调用getPath()方法,就会抛出堆栈中提示的NullPointerException。
可落地的解决方法
- 修正检索路径:将传入
getResource()的路径,替换为从类路径根开始计算的完整相对路径,即"minesweeper/foggedTile.png"。 - 增加空值防御:在调用
getPath()前提前判断资源是否存在,抛出更易定位的自定义错误,避免晦涩的空指针堆栈。
修正后的参考代码:
public Image setFoggedFrontImage() { ClassLoader classLoader = getClass().getClassLoader(); // 匹配resources下的实际子目录路径 URL targetResource = classLoader.getResource("minesweeper/foggedTile.png"); if (targetResource == null) { throw new IllegalStateException("缺失目标图片资源,请检查resources下的目录结构配置"); } String path = targetResource.getPath(); Image NewGameFrontImage = new Image(path); this.frontImage = NewGameFrontImage; return NewGameFrontImage; }
- 场景适配提示:如果项目后续需要打包为独立Jar运行,此时resources下的文件不再是独立磁盘文件,而是Jar包内部的压缩条目,使用
getPath()拿到的本地路径会失效。这种场景下推荐直接通过类加载器获取资源输入流初始化Image对象,不要依赖本地磁盘路径读取资源。
内容的提问来源于stack exchange,提问作者CrazyJackSpider
相关产品推荐
相关产品推荐

