7

由于ByteArrayOutputStream只是写入内存,所以不应出现IOException。但是,由于OutputStream接口的合同,所有流操作在其throws子句中定义了IOExceptionJava:写入ByteArrayOutputStream时发生IOException?

什么是“处理”这种从未发生的正确方法IOException?只需将操作包装在空的try-catch区块中?

或者是否存在ByteArrayOutputStream可能会引发异常的实际情况?

(参见:How can I handle an IOException which I know can never be thrown, in a safe and readable manner?

编辑

正如乔恩指出,ByteArrayOutputStream不会对write方法,它定义声明throws条款 - 然而,它继承write(byte[])OutputStream,而且一个抛出IOEXception(奇怪的是BAOS不会重写此方法,因为它可以取代超类版本 - 一次写入一个字节 - 使用效率更高的arraycopy

回答

9

好,ByteArrayOutputStream宣布它的任何方法抛出IOException除了writeToclose。 (我不知道为什么close仍然声明它,说实话。)

如果你有一个类型为OutputStream的引用,但是当然你仍然会看到抛出的声明。

我不会用一个空的catch块 - 我会扔东西像IllegalStateException或类似的未经检查的异常:这意味着你在你真的不希望的情况是,有什么东西不见了严重错误。

+0

IOException异常的'接近()'必须是一个错误 - 尤其是当javadoc中说,它“没有效果“ – irreputable 2011-06-07 21:50:20

+0

+1谢谢!我只注意到'ByteArrayOutputStream.write'实际上并不声明'IOException' - 但是Eclipse在我使用它时会抱怨一个未处理的异常......奇怪。 – 2011-06-07 21:52:59

+0

@Jen:你确定你调用一个变量的方法*声明为'ByteArrayOutputStream'吗? – 2011-06-08 05:29:54

1

catch块中的典型陈词滥调是throw new RuntimeException(theIOException)。如果不可能发生,你至少可以了解它。

1

异常链接是这种情况下的最佳实践。即抛出一个RuntimeException。

2

我刚刚注意到ByteArrayOutputStream.write实际上并没有声明IOException - 但是Eclipse会在我使用它时抱怨一个未处理的异常......奇怪。

这很容易解释。你可能已经做了这样的事:

OutputStream os = new ByteArrayOutputStream(); 
    ... 
    os.write(); 

“问题”是,你所呼叫的方法OutputStream.write()而不是ByteArrayOutputStream.write()。因此,编译器说:

“啊...... write()OutputStream可以抛出IOException,所以你得处理它。“

这不能说:

”这种特殊的OutputStream真是一个ByteArrayOutputStream ......所以我们放过你“

因为JLS不允许。它

这是边界情况之一,通过编写接口而不是实现类的“最佳实践”回来咬你。

OK等等...

  • 其温柔夹,而不是一个完整的咬了一口。
  • OutputStream是作为Java类而不是Java接口实现的,但这并不重要。
  • 大多数编译器实际上并不你进行交谈,而编译代码:-)

+0

一般而言,你是对的。然而'ByteArrayOutputStream'无情地重新声明'close()'什么都不做,抛出'IOException',所以在这种情况下引用类型无关紧要(OpenJDK)。 – musiKk 2011-06-08 07:11:26

+0

谢谢,很好的解释。我发现了这是怎么回事。我在'ByteArrayOutputStream'的子类中调用'write(byte [])'。 'BAOS'不会覆盖这个方法,所以我实际上是'OutputStream'中定义的方法(它会抛出一个'IOE') – 2011-06-08 07:27:12

相关问题