java – 为什么我的BufferedImage从ImageIO.read()接收一个空值

BufferedImage = ImageIO.read(getClass().getResourceAsStream("/Images/player.gif"));

首先,是的,我确实将图像文件夹添加到了我的类路径中.

为此,我收到错误java.lang.IllegalArgumentException:input == null!

我不明白为什么上面的代码不起作用.从我读到的一切,我不明白为什么它不会.我被告知我应该使用FileInputStream而不是GetResourceAsStream,但正如我刚才所说,我不明白为什么.我已经阅读了有关方法和各种指南的文档,这似乎可行.

编辑:好的,尝试清除一些关于我在类路径中的内容.

这是在Eclipse中创建的项目.一切都在项目文件夹DreamGame中,包括“Images”文件夹.当然,DreamGame是在类路径中.我知道这是有效的,因为我正在使用代码中前面提供的gif信息读取/ Images中的文本文件.

所以我有:/DreamGame/Images/player.gif

编辑2:当前在原始帖子中的行是所有正在传递的行;没有/DreamGame/Images/player.gif,只是/Images/player.gif.这是来自ImagesLoader类中的方法,该方法在创建PlayerSprite中的对象时调用.主要类是DreamGame.我正在使用Run选项直接从Eclipse运行代码而没有特殊参数

试图弄清楚如何找到正在加载类的类加载器.对不起,与大多数人相比,我对此非常陌生.

好的,这就是getClassLoader()给我的东西:sun.misc.Launcher$AppClassLoader@4ba778

getClass().getResource(getClass().getName()“.class”)返回/home/gixugif/Documents/projects/DreamGame/bin/ImagesLoader.class

图像文件也被放入bin中.要仔细检查,我从bin中删除了文件,清理了项目并运行它.仍然有同样的问题,图像文件回到bin

解决方法:

基本上,Class.getResourceAsStream不会按照您的想法执行.

它试图获取相对于该类的类加载器的资源 – 所以除非你有一个以你的文件系统根目录作为其根目录的类加载器,否则它将找不到你所追求的文件.

听起来你应该真的有这样的东西:

BufferedImage = ImageIO.read(getClass().getResourceAsStream("/Images/player.gif"))

(编辑:显示的原始代码不同,并具有完整的文件系统路径.)

并确保将图像复制到当前类的类加载器的适当位置以获取Images目录.当你将它打包到一个jar文件中时,你也想要那里的Images目录.

编辑:这个位可能是问题:

First of all, yes I did add the image folder to my classpath.

images文件夹不应该在类路径中 – Images文件夹的父级应该是,因此当类加载器查找Images目录时,它将在其根目录下找到它.

上一篇:java – 将RGB像素转换为灰度使暗像素显得偏蓝


下一篇:java – 操作图像而不删除其EXIF数据