【问题标题】:Scanner hasNextInt() return true if hasNextInt() has nothing如果 hasNextInt() 没有任何内容,则扫描仪 hasNextInt() 返回 true
【发布时间】:2016-06-25 04:09:23
【问题描述】:

在阅读了 hasNextInt() API 之后,我仍然对这段代码感到迷茫。

Scanner input = new Scanner(System.in);
while (input.hasNextInt()) {
    input.next();
}

为什么即使输入没有任何内容,循环也会开始。此外,hasNextInt() API 提到了

扫描仪不会超过任何输入。

这是什么意思?和这有关系吗?

【问题讨论】:

    标签: java java.util.scanner


    【解决方案1】:

    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,从而导致循环结束。

    【讨论】:

    • 那个API不是只适用于hasNext()而不适用于hasNextInt()吗?另外,你有什么关于阻塞呼叫的好文章吗?我正在阅读的书没有提到任何关于阻止呼叫的内容。
    • 具有 hasNext*() 的函数。 IE。当您在 while 循环中进行第一次调用时,hasNextLong()、hasNextByte()、hasNextShort() 正在阻塞调用。现在我必须告诉你,如果你在终端上输入“12 hello”作为输入,这将导致 while 循环循环一次然后存在。原因是 hasNext*() 读取到第一个空格并检查其是否为 int,然后在第二个循环中遇到一个字符串,因此 hasNextInt() 返回 false,导致循环中断。我认为没有专门讨论阻塞调用的书,但是大多数 IO 相关的调用都是阻塞调用,除非你有一些 JAVA NIO 库
    猜你喜欢
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多