使用"ImageIO.write()" API调用时出现NullPointerException

11
当我传递一个不存在的路径(如“\\abc\abc.png”)时,使用“ImageIO.write()”API调用会导致“NullPointerException”。我故意传递不存在的路径来测试某些东西,但我没有得到“FileNotFoundException”,而是得到了“NPE”。为什么会这样?
“ImageIO.write()”API应该抛出“IOException”,但我不知道为什么会得到“NPE”。
我使用异常消息字符串在消息框中显示它,但在这种情况下,“NPE.getLocalizedMessage()”返回空字符串,因此弹出窗口只有一个图标,没有任何内容。

请分享代码,展示出现此异常的位置。 - maksimov
3
没有接受字符串路径参数的ImageIO.write()方法。请展示您的代码和异常的堆栈跟踪。 - JB Nizet
此外,您甚至可以显示您的“堆栈跟踪”。 - Kazekage Gaara
一般提示。1)即使您可以找到一个接受字符串表示文件路径或URL的J2SE方法,请不要使用它,而是使用重载的变体,接受FileURL。 2)如果使用File,请从JFileChooser获取它。更容易为用户和更可靠。3)"\\abc\abc.png"不是任何操作系统上的有效文件路径,并且我认为它不会编译。停止浪费时间(更重要的是我们的时间),通过键入“类似于”所使用的代码。为了更快地获得更好的帮助,请发布SSCCE - Andrew Thompson
@AndrewThompson - 我不想浪费我的时间或任何人的时间。如果你像Peter一样不能理解问题,那不是我的错。然而,我已经找到了我的问题的原因/解决方案。感谢你的粗鲁。 - Nayan Soni
“我不想浪费我的时间或别人的时间。”真正的证明在于行动,而非言语。请记住这一点。你的问题研究和表达都很粗糙,正如它所获得的另外两个负评所示。 - Andrew Thompson
2个回答

17

尽管如此,他是正确的。例如,这段代码:

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尝试关闭未打开的流时就会出现NullPointerException异常。
至于为什么如此残忍地抑制异常,我不知道。代码片段如下:
try {
 return new FileImageOutputStream((File)output);
} catch (Exception e) {
 e.printStackTrace();
 return null;
}
唯一的解决方法是在尝试使用ImageIO之前验证路径。

只捕获NullPointerException不是更好吗?让其他异常继续往上抛出。 - TinusSky

2

我找到了这个帖子中提到的NPE问题的原因。Peter Hull说得非常正确。

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

这正是我的代码所看起来的样子。感谢Peter的强调。
这个问题的原因是new FileImageOutputStream()抛出了FileNotFoundException,但是一些Sun程序员捕获了异常,打印了堆栈跟踪,并返回了null。这就是为什么不再能够捕获FileNotFoundException的原因 - 它已经被打印了。不久之后,返回的null值会导致NullPointerException,这就是我调用的方法抛出的异常。当打印异常的堆栈跟踪时,我可以看到FileNotFoundException以及上述原因的NPE。
-Nayan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接