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

我一直和我的伙伴一起制作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.(Sprite.java:7) at com.brickbattle.client.src.objs.Tile.(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.(SpriteSheet.java:17) at com.brickbattle.client.src.gui.SpriteSheet.(SpriteSheet.java:8) 

再次感谢!

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

有关解释,请参阅此答案 。

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

这应该工作:

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

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

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

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

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