java getResourceAsStream返回空值[重复]

omqzjyyz  于 2023-03-06  发布在  Java
关注(0)|答案(1)|浏览(136)
    • 此问题在此处已有答案**:

getResourceAsStream returns null(26个答案)
3天前关闭。
我试着用getResourceAsStream获取一个图像,然后放入InputStream,但是值仍然是return null。

public static BufferedImage GetSpriteAtlas(String fileName) {
    BufferedImage img = null;
    InputStream is = LoadSave.class.getResourceAsStream("/" + fileName);
    try {
        img = ImageIO.read(is);

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return img;
}

这是我设计的树。

-Project
  -src
    -main
      -java
        -utilities
          -LoadSave.java
      -resources
        -image.png
a14dhokn

a14dhokn1#

运行System.out.println(LoadSave.class.getResource("LoadSave.class"));,它会告诉你它在找什么。
然后确保你的图像在同一个地方。所以,如果,比方说,这打印了这样的东西:

file:jar:/home/niccolo/project/foo/dist/mygame.jar!/com/pkg/LoadSave.class

然后,上面的代码将在mygame.jar中查找条目/image.png。确保它在那里。或者,如果它在那里,但在不同的路径中,例如,在/img/image.png中,编辑对"/img/" + fileName的调用。确保也打印它("/" + fileName)并且记住大小写很重要,它必须精确匹配,并且资源文件中的点不能超过1个(save_icon.png很好。save.icon.png由于愚蠢的遗留原因而不起作用)。
此外,您使用的是15年前过时的java构造,这更简单、更短,也更难意外导致资源泄漏:

public static BufferedImage GetSpriteAtlas(String fileName) {
    try (var is = LoadSave.class.getResourceAsStream("/" + fileName)) {
        return ImageIO.read(is);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

try-with更简单、更安全。"捕捉异常,运行e.printStackTrace(),然后盲目地继续"的范例非常有害,当只发生一个错误时,会在日志中导致大量错误(想一想--发生了意想不到的事情,所以,你......打印一份报告,然后继续写下去?不要继续写下去!)--让你写糟糕的代码,然后导致愚蠢的抱怨("哦,不,java null很烦人--实际上,它并不烦人,但如果你一直编写通过将错误打印到控制台并返回null来对错误做出React的方法,是的,那么它会变得很烦人。干脆停止这样做吧)。
注:您可以使用任何zip工具或jar tvf mygame.jar检查jar文件的内容,如果映像根本不在其中,则您的构建失败,我建议您发布一个新问题,发布您的构建过程(例如pom.xmlbuild.gradle或诸如此类的,以及您运行什么命令来构建您的jar),发布您的jar包含什么,发布您想要的,并发布项目的基本结构(例如,posix终端环境中find命令的输出)。

相关问题