尝试使用 ImageIO.read(class.getResource(URL)) 加载图像,但 getResource 返回 null

Posted

技术标签:

【中文标题】尝试使用 ImageIO.read(class.getResource(URL)) 加载图像,但 getResource 返回 null【英文标题】:Trying to load image using ImageIO.read(class.getResource(URL)) but getResource is returning null 【发布时间】:2017-02-03 04:06:51 【问题描述】:

我一直在和我的朋友一起制作 2D 游戏,并且通过一些 Youtube 教程学习了很多关于一些基本游戏开发概念的知识。我正在学习的一件事是精灵(对于那些不知道的人,将 2D 图像渲染到屏幕上)以及如何在我的游戏中使用它们。我一直在使用ImageIO.read(this.class.getResource(pathToMySprite)),但似乎getResource() 出于某种原因正在返回null

我一直在修改路径,在它前面添加“/”,删除“/”,放置 user.dir 属性以查看它是否需要整个路径,我仍然得到同样的错误。

TILE_TEXTURES(System.getProperty("user.dir") + "/textures/tile.png");
//ENTITY_TEXTURES("/textures/entity.png");
private BufferedImage img;

private SpriteSheet(String path) 

System.out.println(System.getProperty("user.dir"));
try 
   //TODO: Fix this error, don't know what's wrong.
     img = ImageIO.read(SpriteSheet.class.getResource(path)); // error here!!!
     catch (IOException e) 
      e.printStackTrace();
    
 

public BufferedImage getImage() 
        return img;

我们不胜感激。 我没有评论代码(我通常会在我可以坐下来并对我完成的内容感到满意时这样做)但这是一个非常小的课程,所以我认为你们将能够理解什么是一切顺利。

在我的项目的类路径中保存图像 IS 的文件夹。 我还包括了错误:

Exception in thread "Thread-2" java.lang.ExceptionInInitializerError
    at com.brickbattle.client.src.gui.Sprite.<clinit>(Sprite.java:7)
    at com.brickbattle.client.src.objs.Tile.<init>(Tile.java:67)
    at com.brickbattle.client.src.objs.Player.initPlayerNum(Player.java:19)
    at com.brickbattle.client.src.util.BrickBattle.init(BrickBattle.java:114)
    at com.brickbattle.client.src.util.BrickBattle.run(BrickBattle.java:85)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: input == null! //HERE IS ERROR
    at javax.imageio.ImageIO.read(Unknown Source)
    at com.brickbattle.client.src.gui.SpriteSheet.<init>(SpriteSheet.java:17)
at com.brickbattle.client.src.gui.SpriteSheet.<clinit>(SpriteSheet.java:8)

再次感谢!

【问题讨论】:

这篇文章可能会有所帮助:***.com/questions/6608795/… 不要使用this.class.getResource()试试getClass().getResource() 【参考方案1】:

这个问题基本上与ImageIO无关,而是Class/ClassLoader.getResourcegetResourceAsStream是如何工作的。

有关说明,请参阅this answer。

在任何情况下,这些获取资源的方式只能从类路径中读取(即user.dir 在这里永远不会有帮助)。

这应该可行:

ImageIO.read(getClass().getResource("/path/to/resource"));

路径相对于类路径的 (由前导 / 指定)。

如果您的资源不在类路径中,只需使用:

ImageIO.read(new File("path/to/resource");

路径相对于您的应用程序启动的目录

【讨论】:

以上是关于尝试使用 ImageIO.read(class.getResource(URL)) 加载图像,但 getResource 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 ImageIO.read(文件文件)读取 JPEG 图像

使用 ImageIO.read() 生成的图像是不是仍使用传递给它的相同内存?

ImageIO.read() 返回 403 错误

Java压缩图片ImageIO.read()报错

ImageIO.read() 返回 null

ImageIO.read(getClass().getResource("imagepath")) 中 getclass() 的实际目的是啥 [重复]