Java ImageIO:异常怪异

Java ImageIO:异常怪异,java,exception,io,ioexception,filenotfoundexception,Java,Exception,Io,Ioexception,Filenotfoundexception,在我的应用程序中,我试图使用ImageIO将BufferedImage保存到PNG文件中。该文件是由用户选择的,因此我需要对可能发生的错误做出反应(例如,用户试图保存在他没有写入权限的位置)。但是,我无法捕获发生的IOException 下面的代码显示了该问题。尝试保存到“/foo”会对*nix系统上的大多数用户引发异常,因为他们在根目录中没有写权限 import java.awt.image.BufferedImage; import java.io.File; import java.io.

在我的应用程序中,我试图使用
ImageIO
BufferedImage
保存到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)

我做错了什么?

它源于
ImageIO
实现的细节。如果不将
文件
实例传递到
ImageIO.write
,但首先尝试自己打开一个
文件输出流
并将其传递到
write
,则可以避免此问题

这是对
ImageIO中发生的情况的更精确的分析

:


如果你看一下
createImageOutputStream
的实现,你会看到几个返回
null
的代码路径,它看起来像
ImageIO.write
方法打印
IOException
,但实际上没有处理它,并以
NullPointerException
结束。在这个bug库的特定情况下,可能您应该捕获任何
运行时异常


当然,最好在测试目录是否存在之前进行测试。

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


您应该捕获
NullPointerException
,或者最好在调用
ImageIO.write()

之前检查文件是否存在。从外观上看,FileNotFoundException正在javax.ImageIO.ImageIO.write中处理,该故障导致了null指针异常。在保存文件之前,请检查文件权限

没有“原因”来证明你的结论是正确的。
catch (FileNotFoundException e) {
    System.out.println("Caught FileNotFoundException!");
} catch (IOException e) {
    System.out.println("Caught IOException!");
}
stream = createImageOutputStream(output);
stream.close();