You need to enable JavaScript to run this app. Java从resources目录加载图片时触发NullPointerException
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 05:54:05