为什么ByteArrayOutputStream.close()抛出IOException?

时间:2016-09-22 20:10:52

标签: java stream bytearrayoutputstream

为什么ByteArrayOutputStreamclosethrows IOException一起宣布? 首先,事实上它不能扔任何东西,因为它的身体是空的。其次,在法律上它不能抛出任何东西,因为它的文档说“关闭ByteArrayOutputStream没有效果”。

这不是(不重要,但仍然)有点错误吗?

是的,我了解其超类OutputStream实现了Closable,其close方法允许抛出IOException。但是没有人禁止用ByteArrayOutputStream方法覆盖它(在close中),没有抛出规范。 (即使在一些古老版本的Java中禁止使用投掷较少的方法覆盖更多抛出方法,更改ByteArrayOutputStreamclose定义现在也不会兼容变化。)

1 个答案:

答案 0 :(得分:3)

最合理的解释(除了疏忽)是兼容性。回到Java 1.1,ByteArrayOutputStream did not override close(),所以它继承了OutputStream声明IOException的方法。那时,它可能是一个疏忽。也许,开发人员认为这是不必要的,因为无论如何都没有人会在close()上打电话ByteArrayOutputStream。但是文档缺乏关于调用close()是不必要的明确声明。

自Java 1.2 aka Java 2以来,ByteArrayOutputStream does override close()。但是删除throws子句会导致代码在close()上调用ByteArrayOutputStream并捕获已检查的IOException以在未在任何其他情况下抛出异常时产生编译时错误放在try区块内。由于这不会影响二进制兼容性,因此考虑到自那时起对源代码级别产生了更多影响的变化,可能看起来很奇怪。

但是这个决定已经很久了。还不清楚,为什么要添加覆盖,因为继承的no-op足够且覆盖不会改变签名,并且在该版本中也没有包含有用的文档改进,即没有关于{{1不必要的。最合理的解释是添加它是为了删除close()子句,但后来检测到不兼容性是某些现有代码的问题。

最后,删除它并不重要。如果编译时类型为throws,则表示您无需致电ByteArrayOutputStream。在所有其他情况下,即如果编译时类型更通用close(),则必须OutputStream并处理声明的close() ...