2

由于 Java 支持异常,我认为EOFException在尝试读取输入流末尾的字节时会抛出 an ,例如

byte read() throws EOFException, IOException

但实际上InputStream#read返回

数据的下一个字节,如果到达流的末尾,则为 -1。

这让我想起了getcharC。但另一方面它抛出

IOException: 如果发生 I/O 错误。

为什么会这样设计?

4

3 回答 3

4

许多早期的 API 不太理想,并且有很多讨论,设计人员希望他们可以做得不同。

我推测这不是其中一种情况。抛出“EOFException”可能会鼓励程序员try阅读,直到捕获到异常。意味着异常处理将被用作控制程序逻辑的一种方式,称为异常处理反模式

于 2012-09-01T07:08:14.370 回答
4

它是这样设计的,因为到达通常EOF不是一个特殊的事件。

根据官方Java教程

异常是在程序执行期间发生的事件,它破坏了正常的指令流。

所以大多数时候返回EOF是完全没问题的。

但是,在某些情况下,抛出异常更有意义。例如,DataInputStream类有一个称为readFully抛出的方法:

EOFException - 如果此输入流在读取所有字节之前到达末尾。

简而言之,anEOFException表示EOF在正常指令流期间返回的破坏性事件。

于 2012-09-01T07:15:45.960 回答
2

以我的拙见,人们应该问自己,在以“正常”方式读取流时,是否应该将到达文件末尾视为异常。
一个异常来让我们知道我们的应用程序存在异常错误行为,事实并非如此。如果您查看EOFException的 javadoc,您会看到,我引用 -

表示输入期间意外到达文件结尾或流结尾。

请注意“意外一词,以及此 javadoc 在下一句中的保留。

于 2012-09-01T07:16:37.443 回答