2

Java サポート例外なのでEOFException、入力ストリームの最後にあるバイトを読み取ろうとすると、次のようにスローされると思いました。

byte read() throws EOFException, IOException

しかし、実際にはInputStream#readが返されます

データの次のバイト、またはストリームの終わりに達した場合は -1。

これはCのことを思い出させますがgetchar、一方でスローします

IOException: I/O エラーが発生した場合。

なぜこのような設計になっているのでしょうか。

4

3 に答える 3

4

通常、リーチEOFは例外的なイベントではないため、そのように設計されています。

公式Javaチュートリアルによると:

例外とは、プログラムの実行中に発生し、命令の通常の流れを中断するイベントです。

したがって、ほとんどの場合、返品EOFはまったく問題ありません。

ただし、例外をスローする方が理にかなっている場合もあります。たとえば、クラスには、次をスローDataInputStreamするというメソッドがあります。readFully

EOFException - すべてのバイトを読み取る前に、この入力ストリームが最後に到達した場合。

つまり、通常の命令フロー中に返さEOFExceptionれる中断イベントを意味します。EOF

于 2012-09-01T07:15:45.960 に答える
4

初期の API の多くは望ましいものではなく、設計者が別の方法で実現できればよかったという議論が数多くあります。

これはそれらのケースの1つではないと推測します。「EOFException」をスローすると、プログラマーtryは例外がキャッチされるまで読み取りを行うようになるでしょう。つまり、例外処理は、例外処理アンチパターンと呼ばれるプログラム ロジックを制御する方法として使用されます。

于 2012-09-01T07:08:14.370 に答える
2

私の謙虚な意見では、「通常の」方法でストリームを読み取るときに、ファイルの終わりに到達することを例外と見なす必要があるかどうかを自問する必要があります。
例外は、アプリケーションに例外的な間違った動作があることを知らせてくれますが、これは事実ではありません。EOFExceptionの javadoc を見ると、表示されます。引用します-

入力中にファイルの終わりまたはストリームの終わりに予期せず到達したことを通知します。

「unexpectedly」という単語と、この javadoc の次の文にある予約に注意してください。

于 2012-09-01T07:16:37.443 に答える