使用“ImageIO.write()”API调用我得到空指针异常

问题描述:

ImageIO.write() API调用时,我得到NullPointerException当我通过一个不存在的路径如"\\abc\abc.png"。我通过不存在的路径特意来测试一些而是获得FileNotFoundException,我得到NPE。这是为什么?使用“ImageIO.write()”API调用我得到空指针异常

ImageIO.write() API应该扔IOException,但不要为什么我得到NPE

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

+0

共享用于该异常发生请 – maksimov

+3

没有服用作为参数的String路径ImageIO.write()方法的代码。向我们显示您的代码以及异常的堆栈跟踪。 –

+0

另外,你甚至可以显示你的'stacktrace'。 –

正确,虽然。例如,下面的代码:

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异常,然后NPE来当ImageIO.write试图关闭流是没开。

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

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

唯一的解决办法是试图使用的ImageIO之前验证路径

+0

只捕获NullPointerException不是更好吗?并让其他例外上升到树上。 – TinusSky

我发现对于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); } 

这正是我的代码的样子。感谢彼得突出显示。

此问题的原因是新的FileImageOutputStream()抛出FileNotFoundException,但是一些Sun程序员去了并捕获了异常,打印了堆栈跟踪并返回null。这就是为什么不能再捕捉FileNotFoundException - 它已经打印出来了。不久之后,返回的null值将导致NullPointerException异常,这是从我调用的方法抛出的异常。当印刷异常的堆栈跟踪,我可以看到FileNotFoundException异常与NPE沿上面提到的原因。

-Nayan