0

私は本Java™I/O、2nd Editionを読んでいて、次のコードがあります。

try {
  byte[] b = new byte[10];
  System.in.read(b);
}
catch (IOException ex) {
  System.err.println("Couldn't read from System.in!");
}

本からの引用:

「..収まるよりも多くのデータを配列に読み込もうとするのを妨げるものは何もありません。これを行うと、read()はArrayIndexOutOfBoundsExceptionをスローします。」

しかし、このコードを実行して10文字を超える文字を入力すると、noArrayIndexOutOfBoundsExceptionはスローされます。なぜそうなのですか?

4

2 に答える 2

6

ドキュメントを確認してくださいInputStream.read

読み取られるバイト数は、最大でbの長さに等しくなります。

したがって、read呼び出しは配列の長さに従い、実際に読み取られるバイト数をその長さに制限します。たとえば10文字を超えて入力すると、それらの追加の文字は入力ストリームに残ります。別のreadことをすると、それらが表示されます。

を使用することができます。IndexOutOfBoundsExceptionInputStream.read(array, offset, length)

于 2012-09-24T19:08:28.260 に答える
0

あなたの本は間違っていて、表現も不十分です。次の2つのステートメントは相互に矛盾しています。

「..収まるよりも多くのデータを配列に読み込もうとするのを妨げるものは何もありません。これを行うと、read()はArrayIndexOutOfBoundsExceptionをスローします。」

エリオット・ラスティ・ハロルドが例外を「あなたを止めるものは何もない」と考える理由はわかりません。それはあなたを止めます、そしてそれはその目的です。

真実は、代わりにEOSを検出して-1を返さない限り、InputStream.read()少なくとも1バイト、最大で1バイトを読み取るということです。b.length

read(byte[] buffer, int offset, int length)オーバーロードを使用するIndexOutOfBoundsException場合、「off [set]が負、len [gth]が負、またはlen[gth]がb[uffer] .length--off[set]より大きい」場合にスローされます。

于 2012-09-25T01:18:36.663 に答える