【问题标题】:Java ImageIO.read() returning nullJava ImageIO.read() 返回 null
【发布时间】:2016-05-28 05:19:54
【问题描述】:

我想在我的项目中读取图像(.png 文件),并且我希望它也可以在可运行的.jar 文件中工作。所以我写了这么一小段代码:

try {
    InputStream in;
    in = Loader.class.getClassLoader().getResourceAsStream("buttons.png");

    System.out.println(in.read() + ", Reader: " + in);          

    BufferedImage img = ImageIO.read(in);

    System.out.println(img.getHeight());

    in.close(); 
} catch (IOException e) {
    e.printStackTrace();
}

当我运行它时,我得到以下输出:

137, Reader: java.io.BufferedInputStream@15db9742
Exception in thread "main" java.lang.NullPointerException
    at test.Loader.load(Loader.java:21)
    at test.MainTest.main(MainTest.java:6)

我的MainTest 只运行此代码,所以我不会在此处包含它。

我已经测试了InputStream 是否为null,您可能已经注意到了。因为它显然不是我的文件的路径必须是正确的。我的问题是:为什么ImageIO.read() 会返回null

【问题讨论】:

  • 检查buttons.png在Loader类路径的根目录下。区分大小写,使用 7zip、WinZip 等检查 .jar 文件。
  • getResource(AsStream) 在找不到资源时会返回null

标签: java windows nullpointerexception javax.imageio


【解决方案1】:

https://docs.oracle.com/javase/8/docs/api/javax/imageio/ImageIO.html#read-javax.imageio.stream.ImageInputStream-

ImageIO.read(...) 如果无法解码图像,可能会返回 null。也检查一下这种情况。

【讨论】:

    【解决方案2】:

    正如您在调用ImageIO.read 之前已经阅读过InputStream,可能会发生该函数无法正确解码图像的情况。移除对in.read()的调用,并测试调用结果。

    【讨论】:

      【解决方案3】:

      您的代码的问题是在将其传递给ImageIO.read(..) 之前从in 读取的行(您正在读取第一个字节):

      System.out.println(in.read() + ", Reader: " + in);
      

      当您从流中读取一个字节时,该字节被有效地“消耗”并且不会再次被读取,因此ImageIO 将永远不会看到该字节,从而导致无法识别文件格式(PNG)。在这种情况下,ImageIO.read(..) 将返回 null

      只需删除该行,您的代码应该可以正常工作。

      该文件似乎存在为in 不是null。而您打印的值137 实际上是PNG signature 的第一个字节,这意味着该文件很好并且正确地包含在您的JAR 中。


      如果您确实需要在传递给ImageIO 之前查看流中的字节,您可以执行以下操作:

      in.mark(256); // allows you to read up to 256 bytes before calling reset()
      System.out.println(in.read() + ", Reader: " + in); // or whatever you like to do
      in.reset(); // "rewind" to beginning of stream (previous mark)
      

      请注意,并非所有流都支持mark()/reset() 方法(您可以使用boolean markSupported() 方法进行测试)。

      【讨论】:

      • 你说得对。我现在也解决了这个问题:D。但是非常感谢您的帮助和详细的解释:)
      猜你喜欢
      • 2021-12-15
      • 2014-11-08
      • 1970-01-01
      • 2016-09-27
      • 2012-04-14
      相关资源
      最近更新 更多