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 个字符时,没有ArrayIndexOutOfBoundsException抛出;为什么会这样?

4

2 回答 2

6

检查文档InputStream.read

读取的字节数最多等于 b 的长度

因此read调用遵守数组的长度,并将实际读取的字节数限制为该长度。当您输入超过 10 个字符时,这些额外的字符将保留在输入流中。做另一个read,你会看到他们。

可以导致IndexOutOfBoundsExceptionusing InputStream.read(array, offset, length)

于 2012-09-24T19:08:28.260 回答
0

你的书是错误的,它也表达得很糟糕。以下两种说法相互矛盾:

“..没有什么可以阻止您尝试将更多数据读入数组中。如果您这样做,read() 将引发 ArrayIndexOutOfBoundsException。”

我不知道为什么 Elliotte Rusty Harold 认为例外是“没有什么能阻止你”。它确实阻止了你,这就是它的目的。

事实是,InputStream.read()它将读取至少 1 个和最多b.length字节,除非它检测到 EOS 并返回 -1。

如果您使用重载,如果“off[set] 为负数、len[gth] 为负数或 len[gth] 大于 b[uffer].length - off[set]” read(byte[] buffer, int offset, int length),它将抛出异常。IndexOutOfBoundsException

于 2012-09-25T01:18:36.663 回答