为什么ByteArrayOutputStream
。close
与throws IOException
一起宣布?
首先,事实上它不能扔任何东西,因为它的身体是空的。其次,在法律上它不能抛出任何东西,因为它的文档说“关闭ByteArrayOutputStream没有效果”。
这不是(不重要,但仍然)有点错误吗?
是的,我了解其超类OutputStream
实现了Closable
,其close
方法允许抛出IOException
。但是没有人禁止用ByteArrayOutputStream
方法覆盖它(在close
中),没有抛出规范。 (即使在一些古老版本的Java中禁止使用投掷较少的方法覆盖更多抛出方法,更改ByteArrayOutputStream
。close
定义现在也不会兼容变化。)
答案 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()
...