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



我一直在与好友制作一款2D游戏,并通过一些Youtube教程学习了一些基本的游戏开发概念。我正在学习的一件事是精灵(游戏邦注:即2D图像)以及如何在游戏中使用它们。我一直在使用ImageIO.read(this.class.getResource(pathToMySprite)),但由于某种原因,getResource()似乎正在返回null

我对路径做了一些改动,在它前面加了"/",去掉了"/",把用户。属性,看看是否需要整个路径,我仍然得到相同的错误。

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;
}

任何和所有的帮助是感激。我没有注释代码(我通常在我可以坐下来并对我完成的内容感到高兴的时候注释代码),但这是一个相当小的类,所以我认为你们能够理解发生了什么。

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

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)

再次感谢!

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

的解释,参见这个答案。

在任何情况下,这些获取资源的方法只能从类路径读取。user.dir在这里永远帮不上忙。

这个应该可以工作:

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

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

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

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

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

最新更新