【问题标题】:With "ImageIO.write()" API call I get NullPointerException使用“ImageIO.write()”API 调用我得到 NullPointerException
【发布时间】:2012-06-22 09:05:42
【问题描述】:

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

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

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

【问题讨论】:

  • 请分享出现此异常的代码
  • 没有 ImageIO.write() 方法将字符串路径作为参数。向我们展示您的代码,以及异常的堆栈跟踪。
  • 另外,您甚至可以显示您的stacktrace
  • 一般提示。 1) 即使您能找到接受字符串来表示文件路径或 URL 的 J2SE 方法,也不要使用它,而是使用接受 FileURL 的重载变体。 2) 如果使用File,请从JFileChooser 获取。对用户来说更容易,更可靠。 3) "\\abc\abc.png" 不是 any 操作系统上的有效文件路径,在我看来它无法编译。通过键入“类似于”使用的代码来停止浪费您的时间(更重要的是我们的时间)。为了尽快获得更好的帮助,请发帖SSCCE
  • @AndrewThompson - 我对浪费我的时间或其他人的时间不感兴趣。如果你不能像彼得那样理解这个问题,这不是我的错。但是,我找到了查询的原因/解决方案。谢谢你的粗鲁。

标签: java exception javax.imageio


【解决方案1】:

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

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 之前验证路径

【讨论】:

  • 只捕获 NullPointerException 不是更好吗?并让其他异常上树。
【解决方案2】:

我发现了此线程中提到的问题的 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-04-14
    • 1970-01-01
    • 2016-09-07
    • 2019-12-04
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 2019-12-16
    • 2020-07-25
    相关资源
    最近更新 更多