Java ImageIO:异常怪异

时间:2012-08-22 14:01:09

标签: java exception io ioexception filenotfoundexception

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

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

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 (FileNotFoundException e) {
    System.out.println("Caught FileNotFoundException!");
} catch (IOException e) {
    System.out.println("Caught IOException!");
}

我做错了什么?

4 个答案:

答案 0 :(得分:6)

它源于ImageIO实施的细节。如果您未将File实例传递给ImageIO.write,则会绕过问题,但首先尝试自己打开FileOutputStream并将其传递给write

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

stream = createImageOutputStream(output);

Line 1538

stream.close();

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

答案 1 :(得分:4)

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

当然,如果目录存在且is writable

,最好先测试一下

答案 2 :(得分:0)

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

在调用NullPointerException之前,您应该抓住ImageIO.write()或更好地检查文件存在。

答案 3 :(得分:0)

通过它的外观,在javax.imageio.ImageIO.write中处理FileNotFoundException,并且该失败导致空指针异常。在尝试保存之前尝试检查文件权限!