5

在我的应用程序中,我试图BufferedImage使用ImageIO. 该文件是由用户选择的,所以我需要对可能发生的错误做出反应(例如,用户试图保存在他没有写权限的位置)。但是我无法捕捉到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)

请注意,这FileNotFoundException是一个子类,IOException所以它应该被抓住。第二个 catch 块也没有帮助:

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

我究竟做错了什么?

4

4 回答 4

6

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

这是对ImageIO.write. 第 1530 行

stream = createImageOutputStream(output);

第 1538 行

stream.close();

如果你看一下 的实现createImageOutputStream,你会看到几个返回的代码路径null

于 2012-08-22T14:06:12.613 回答
4

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

当然,如果目录存在并且可写,最好先测试一下。

于 2012-08-22T14:07:04.667 回答
0

似乎将ImageIO.write()包装FileNotFoundExceptionNullPointerException.

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

于 2012-08-22T14:09:42.557 回答
0

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

于 2012-08-22T14:10:24.577 回答