在
中ImageIO.write(RenderedImage中,字符串,文件)
方法,ImageOutputStream是通过
创建的stream = createImageOutputStream (输出);。
在 createImageOutputStream 中捕获运行时异常并从catch块返回null。
try {
iter = theRegistry.getServiceProviders(ImageOutputStreamSpi.class,true);
} catch (IllegalArgumentException e) {
return null;
}
任何人都可以帮助我理解:
请帮忙。
答案 0 :(得分:1)
可能是一段代码随着时间的推移而发展,没有人愿意清理,或者ImageIO
的实施者可能依赖于ServiceRegistry
的合同,而不是它的实现细节。在ImageIO
和ServiceRegistry
的当前实现中,我看不出这是如何发生的。
我能看到的唯一好处是,你现在可能会改变IIORegistry
或ServiceRegistry
的实现,例如延迟加载类别,或者可能清除类别没有服务提供商(Spi)出席。方法的合同不会中断,ImageIO
类仍然可以正常工作。
现在,回到你问题中的问题,答案是永远不应该抛出NullPointerException
。 *
如果您真的想要,可以通过取消注册stream
(null
)的Spi来使File
成为FileImageOutputStreamSpi
。但即便如此,表现良好的ImageWriter
也应抛出一个IllegalStateException
,表示输出尚未设置,而不是NullPointerException
(当然,编程错误可能导致其他地方的NPE,但这不是正常的流程)。
<强>更新强>
*)正如OP自己在链接答案中指出的那样,如果你传递一个指向不存在路径的NullPointerException
对象,则确实会发生File
投掷。发生这种情况是因为FileImageOutputStreamSpi
“吞下”由IOException
构造函数引起的RandomAccessFile
(它确实将堆栈跟踪打印到标准输出),并返回null
。在我看来,这会以一种更严厉的方式打破合同,而不仅仅是让IOException
冒泡,或将其包装在IllegalArgumentException
中,原始异常作为原因和一些解释性消息。考虑提交一份错误报告,如果它尚不存在,则可以解决此问题。