由于Java支持异常,我认为在尝试读取输入流末尾的字节时会抛出EOFException
,例如
byte read() throws EOFException, IOException
但实际上InputStream#read会返回
数据的下一个字节,如果到达流的末尾则为-1。
让我想起了C中的getchar
但另一方面却抛出了
IOException
:如果发生I / O错误。
为什么这样设计?
答案 0 :(得分:4)
很多早期的API都不太令人满意,而且有很多讨论,设计师希望他们可以做到与众不同。
我推测这不是其中之一。抛出“EOFException”可能会鼓励程序员try
读取,直到发现异常。意义异常处理将用作控制程序逻辑的一种方式,称为异常处理反模式
答案 1 :(得分:4)
它是这样设计的,因为到达EOF
通常并非特殊事件。
根据官方Java Tutorial:
异常是在程序执行期间发生的事件 这扰乱了正常的指令流。
所以返回EOF
的大部分时间都很好。
但是,有些情况下抛出异常更有意义。例如,DataInputStream
类有一个名为readFully
的方法,它抛出:
EOFException - 如果此输入流在读取所有字节之前到达结尾。
简而言之,EOFException
表示在正常指示流程中返回EOF
时发生破坏性事件。
答案 2 :(得分:2)
在我的拙见中,人们应该问自己,当以“正常”方式阅读流时,到达文件末尾应该被视为例外。
有一个例外,让我们知道在我们的应用程序中存在异常错误的行为,情况并非如此。
如果你看一下EOFException的javadoc,你会看到,我引用 -
表示在输入过程中意外地达到了文件结尾或流结束。
请注意“意外的单词,以及此javadoc在下一句中的预订。