在阅读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
,这导致循环结束。