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

时间:2011-10-31 13:11:18

标签: java bufferedimage

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

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

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

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

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

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

所以我有:/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

2 个答案:

答案 0 :(得分:4)

基本上,Class.getResourceAsStream没有按照您的想法行事。

它尝试获取相对于该类的类加载器的资源 - 因此,除非您的文件系统根目录为根目录的类加载器,否则将无法找到您所访问的文件。 / p>

听起来你很可能真的有类似的东西:

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

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

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

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

  

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

images文件夹不应该在classpath中 - Images文件夹的 parent 应该是,所以当classloader 查找时{{1} }目录,它会在它的根目录下找到它。

答案 1 :(得分:1)

如果使用resourceAsStream“/”引用类路径条目的根,而不是文件系统的根。看看你正在使用的路径可能是原因。

如果从某个主路径加载某些内容,则可能应该使用FileInputStream。 getResourceAsStream用于您使用应用程序部署的内容。