Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

With "ImageIO.write()" API call I get NullPointerException

With ImageIO.write() API call, I get NullPointerException when I pass a non-existent path like "\\abc\abc.png". I pass the non-existent path purposely to test something but instead of getting FileNotFoundException, I get NPE. Why is that?

ImageIO.write() API is supposed to throw IOException but don't why I get NPE.

I use exception message string to show it in a message box to user but in this case NPE.getLocalizedMessage() returns empty string and hence the popup is empty with just an icon on it.

like image 278
Nayan Soni Avatar asked Jun 22 '12 09:06

Nayan Soni


2 Answers

He is right, though. For example, this code:

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);
}

gives

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)

The reason is that FileImageOutputStreamSpi.createOutputStreamInstance swallows the FileNotFoundException and then the NPE comes when ImageIO.write tries to close a stream that didn't open.

Why the exception is suppressed so brutally, I don't know. The code fragment is

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

The only solution is to verify the path before attempting to use ImageIO.

like image 111
Peter Hull Avatar answered Sep 21 '22 00:09

Peter Hull


I found out the reason for NPE for issue mentioned in this thread. Peter Hull is absolutely right in saying

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); }

This is exactly my code looks like. Thanks Peter for highlighting.

The reason for this issue is that new FileImageOutputStream() throws a FileNotFoundException but some Sun programmer went and caught the exception, printed the stack trace, and returned null. Which is why it's no longer possible to catch the FileNotFoundException - it's already printed. Shortly afterwards, the returned null value causes a NullPointerException, which is what it being thrown from the method I called. When printed the Stack Trace of the exception, I could see FileNotFoundException along with NPE for the reason mentioned above.

-Nayan

like image 34
Nayan Soni Avatar answered Sep 21 '22 00:09

Nayan Soni