ImageIO.write何时以及如何抛出nullpointerexception?

时间:2014-05-29 15:44:37

标签: java javax.imageio

  

ImageIO.write(RenderedImage中,字符串,文件)

方法,ImageOutputStream是通过

创建的
  

stream = createImageOutputStream (输出);。

createImageOutputStream 中捕获运行时异常并从catch块返回null。

try {
    iter = theRegistry.getServiceProviders(ImageOutputStreamSpi.class,true);
        } catch (IllegalArgumentException e) {
            return null;
        }

任何人都可以帮助我理解:

  1. 这里捕获运行时异常的原因是什么?(除非它是一个糟糕的编码)
  2. 在什么条件下,代码会抛出非法参数异常? (我没有看到它扔的任何理由)
  3. 请帮忙。

1 个答案:

答案 0 :(得分:1)

可能是一段代码随着时间的推移而发展,没有人愿意清理,或者ImageIO的实施者可能依赖于ServiceRegistry的合同,而不是它的实现细节。在ImageIOServiceRegistry的当前实现中,我看不出这是如何发生的。

我能看到的唯一好处是,你现在可能会改变IIORegistryServiceRegistry的实现,例如延迟加载类别,或者可能清除类别没有服务提供商(Spi)出席。方法的合同不会中断,ImageIO类仍然可以正常工作。

现在,回到你问题中的问题,答案是永远不应该抛出NullPointerException。 *

如果您真的想要,可以通过取消注册streamnull)的Spi来使File成为FileImageOutputStreamSpi。但即便如此,表现良好的ImageWriter也应抛出一个IllegalStateException,表示输出尚未设置,而不是NullPointerException(当然,编程错误可能导致其他地方的NPE,但这不是正常的流程)。

<强>更新

*)正如OP自己在链接答案中指出的那样,如果你传递一个指向不存在路径的NullPointerException对象,则确实会发生File投掷。发生这种情况是因为FileImageOutputStreamSpi“吞下”由IOException构造函数引起的RandomAccessFile(它确实将堆栈跟踪打印到标准输出),并返回null。在我看来,这会以一种更严厉的方式打破合同,而不仅仅是让IOException冒泡,或将其包装在IllegalArgumentException中,原始异常作为原因和一些解释性消息。考虑提交一份错误报告,如果它尚不存在,则可以解决此问题。