11

通过ImageIO.write()API 调用,NullPointerException当我通过一个不存在的路径(如"\\abc\abc.png". 我故意通过不存在的路径来测试某些东西,但我没有得到FileNotFoundException,而是得到NPE。这是为什么?

ImageIO.write()API 应该抛出IOException,但不知道为什么我得到NPE.

我使用异常消息字符串在消息框中向用户显示它,但在这种情况下NPE.getLocalizedMessage()返回空字符串,因此弹出窗口是空的,上面只有一个图标。

4

2 回答 2

16

不过,他对的。例如,这段代码:

public static void main(String[] args) throws IOException {
 BufferedImage image = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB);
 File out = new File("\\\\ABC\\abc.png");
 ImageIO.write(image, "png", out);
}

java.io.FileNotFoundException: \\ABC\abc.png (The network path was not found)
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 javaapplication145.JavaApplication145.main(JavaApplication145.java:24)
Exception in thread "main" java.lang.NullPointerException
at javax.imageio.ImageIO.write(ImageIO.java:1538)
at javaapplication145.JavaApplication145.main(JavaApplication145.java:24)

原因是FileImageOutputStreamSpi.createOutputStreamInstance吞下 FileNotFoundException,然后在ImageIO.write尝试关闭未打开的流时出现 NPE。

为什么异常被如此残酷地压制,我不知道。代码片段是

try {
 return new FileImageOutputStream((File)output);
} catch (Exception e) {
 e.printStackTrace();
 return null;
}

唯一的解决方案是在尝试使用 ImageIO之前验证路径。

于 2012-06-22T10:29:28.930 回答
1

我发现了此线程中提到的问题的 NPE 原因。彼得赫尔说的完全正确

public static void main(String[] args) throws IOException {  BufferedImage image = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB);  File out = new File("\\\\ABC\\abc.png");  ImageIO.write(image, "png", out); }

这正是我的代码的样子。感谢彼得强调。

这个问题的原因是 new FileImageOutputStream() 抛出了 FileNotFoundException 但一些 Sun 程序员去捕获了异常,打印了堆栈跟踪,并返回了 null。这就是为什么不再可能捕获 FileNotFoundException - 它已经打印出来了。不久之后,返回的 null 值会导致 NullPointerException,这是我调用的方法中抛出的异常。当打印异常的堆栈跟踪时,由于上述原因,我可以看到FileNotFoundExceptionNPE 。

-纳扬

于 2012-06-22T10:53:09.937 回答