Java 试图使用ImageIO.read(class.getResource(URL))加载图像,但getResource返回null
我和我的朋友制作了一个2D游戏,通过一些Youtube教程,我学到了很多关于游戏开发的基本概念。我学到的一件事是精灵(对于那些不知道的人来说,2D图像可以渲染到屏幕上)以及如何在我的游戏中使用它们。我一直在使用Java 试图使用ImageIO.read(class.getResource(URL))加载图像,但getResource返回null,java,bufferedimage,javax.imageio,getresource,Java,Bufferedimage,Javax.imageio,Getresource,我和我的朋友制作了一个2D游戏,通过一些Youtube教程,我学到了很多关于游戏开发的基本概念。我学到的一件事是精灵(对于那些不知道的人来说,2D图像可以渲染到屏幕上)以及如何在我的游戏中使用它们。我一直在使用ImageIO.read(this.class.getResource(pathToMySprite)),但出于某种原因,getResource()似乎正在返回null 我对路径做了一些修改,在它前面添加“/”,删除“/”,放置user.dir属性以查看它是否需要整个路径,我仍然得到相同的
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;
}
非常感谢您的帮助。
我没有对代码进行评论(我通常在到达可以坐下来对完成的内容感到满意的地方时进行评论),但这是一个非常小的类,所以我认为你们能够很好地理解正在发生的事情
保存图像的文件夹位于我的项目的类路径中。
我还包括了错误:
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)
线程“thread-2”java.lang.ExceptionInInitializeError中的异常
位于com.brickbattle.client.src.gui.Sprite。(Sprite.java:7)
位于com.brickbattle.client.src.objs.Tile.(Tile.java:67)
位于com.brickbattle.client.src.objs.Player.initPlayerNum(Player.java:19)
位于com.brickbattle.client.src.util.brickbattle.init(brickbattle.java:114)
位于com.brickbattle.client.src.util.brickbattle.run(brickbattle.java:85)
位于java.lang.Thread.run(未知源)
原因:java.lang.IllegalArgumentException:input==null//这是一个错误
位于javax.imageio.imageio.read(未知源)
位于com.brickbattle.client.src.gui.SpriteSheet.(SpriteSheet.java:17)
位于com.brickbattle.client.src.gui.SpriteSheet.(SpriteSheet.java:8)
再次感谢这个问题基本上与ImageIO无关,而是如何
类
/类加载器.getResource
或getResourceAsStream
工作
有关说明,请参阅
在任何情况下,这些获取资源的方法只能从类路径读取(即,user.dir
)
这应该起作用:
ImageIO.read(getClass().getResource("/path/to/resource"));
其中路径相对于类路径的根(由前导/)指定)
如果资源不在类路径上,只需使用:
ImageIO.read(new File("path/to/resource");
其中,路径相对于启动应用程序的目录 这篇文章可能会有所帮助:不要使用
This.class.getResource()
trygetClass().getResource()