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

时间:2013-06-08 19:11:25

标签: java bufferedimage javax.imageio getresource

我和我的好友一起制作2D游戏,我通过一些Youtube教程学习了很多基本的游戏开发概念。我正在学习的其中一件事是sprite(对于那些不知道的人,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)

再次感谢!

1 个答案:

答案 0 :(得分:5)

此问题与ImageIO基本无关,而是Class / ClassLoader.getResourcegetResourceAsStream的工作原理。

有关说明,请参阅this answer

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

这应该有效:

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

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

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

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

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