【问题标题】:Java ImageIO: Exception WeirdnessJava ImageIO:异常怪异
【发布时间】:2012-08-17 23:29:44
【问题描述】:

在我的应用程序中,我尝试使用ImageIOBufferedImage 保存到PNG 文件中。该文件是由用户选择的,因此我需要对可能发生的错误做出反应(例如,用户尝试保存在他没有写入权限的位置)。但是我无法捕捉到发生的IOException

以下代码显示了问题。对于大多数 *nix 系统上的用户来说,尝试保存到“/foo”应该会引发异常,因为他们在根目录中没有写权限。

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class IOTest {

    public static void main(String[] args) {
        BufferedImage img = new BufferedImage(640, 480,
                BufferedImage.TYPE_INT_RGB);
        try {
            File f = new File("/foo");
            ImageIO.write(img, "png", f);
        } catch (IOException e) {
            System.out.println("Caught IOException!");
        }
    }
}

但是,异常没有被捕获。输出:

    java.io.FileNotFoundException: /foo (Permission denied)
    at java.io.RandomAccessFile.open(Native Method)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:233)
    at javax.imageio.stream.FileImageOutputStream.<init>(FileImageOutputStream.java:69)
    at com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(FileImageOutputStreamSpi.java:55)
    at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:419)
    at javax.imageio.ImageIO.write(ImageIO.java:1530)
    at IOTest.main(IOTest.java:16)
Exception in thread "main" java.lang.NullPointerException
    at javax.imageio.ImageIO.write(ImageIO.java:1538)
    at IOTest.main(IOTest.java:16)

注意FileNotFoundExceptionIOException 的子类,所以它应该被捕获。第二个 catch 块也没有帮助:

catch (FileNotFoundException e) {
    System.out.println("Caught FileNotFoundException!");
} catch (IOException e) {
    System.out.println("Caught IOException!");
}

我做错了什么?

【问题讨论】:

    标签: java exception io ioexception filenotfoundexception


    【解决方案1】:

    源于ImageIO实现的细节。如果您不将File 实例传递给ImageIO.write,您将绕过该问题,但首先尝试自己打开一个FileOutputStream 并将其传递给write

    这是对ImageIO.write 中发生的事情的更精确分析。 Line 1530:

    stream = createImageOutputStream(output);
    

    Line 1538:

    stream.close();
    

    如果您查看createImageOutputStream 的实现,您会看到几个返回null 的代码路径。

    【讨论】:

      【解决方案2】:

      看起来ImageIO.write 方法打印了IOException,但实际上并没有处理它并以NullPointerException 结束。在这种有问题的库的特定情况下,也许您应该捕获任何RuntimeException...

      当然最好先测试一下目录是否存在和is writable

      【讨论】:

        【解决方案3】:

        似乎ImageIO.write()FileNotFoundException 包装成NullPointerException

        您应该在调用ImageIO.write() 之前捕获NullPointerException,或者更好地检查文件是否存在。

        【讨论】:

        • 没有“原因”来证明你的结论。
        【解决方案4】:

        从外观上看,FileNotFoundException 正在 javax.imageio.ImageIO.write 中处理,并且该故障导致空指针异常。在尝试保存之前尝试检查文件权限!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多