【发布时间】:2016-06-25 04:09:23
【问题描述】:
在阅读了 hasNextInt() API 之后,我仍然对这段代码感到迷茫。
Scanner input = new Scanner(System.in);
while (input.hasNextInt()) {
input.next();
}
为什么即使输入没有任何内容,循环也会开始。此外,hasNextInt() API 提到了
扫描仪不会超过任何输入。
这是什么意思?和这有关系吗?
【问题讨论】:
在阅读了 hasNextInt() API 之后,我仍然对这段代码感到迷茫。
Scanner input = new Scanner(System.in);
while (input.hasNextInt()) {
input.next();
}
为什么即使输入没有任何内容,循环也会开始。此外,hasNextInt() API 提到了
扫描仪不会超过任何输入。
这是什么意思?和这有关系吗?
【问题讨论】:
Scanner input = new Scanner(System.in) 不是阻塞调用,它只是创建一个以STDIN 为输入的新扫描器。因此执行进入while循环。
来自Oracle - Scanner (Java Platform SE 7)的API文档
如果此扫描器在其输入中有另一个令牌,则返回 true。此方法可能会在等待输入扫描时阻塞。扫描仪不会超过任何输入。
扫描仪等待(input.hasNextInt()此时实际上是一个阻塞调用)等待用户输入内容并按Enter。
然后在input.next() 调用中,它实际上读取输入(消耗它)并推进读取位置。
但是,如果您在终端或控制台中输入类似 12 hello 的内容,这将导致 while 循环循环一次然后退出。原因是hasNextInt() 一直读取到第一个空格并检查直到空格的字符是否是有效的int。在这种情况下,它们是并且hasNextInt() 返回true。然后,在循环的第二次迭代中,它遇到了String,因此hasNextInt() 返回false,从而导致循环结束。
【讨论】: