Java 如果hasNextInt()没有任何内容,则Scanner hasNextInt()返回true
在阅读了hasNextInt()API之后,我仍然对这段代码感到困惑Java 如果hasNextInt()没有任何内容,则Scanner hasNextInt()返回true,java,java.util.scanner,Java,Java.util.scanner,在阅读了hasNextInt()API之后,我仍然对这段代码感到困惑 Scanner input = new Scanner(System.in); while (input.hasNextInt()) { input.next(); } 为什么即使输入没有任何内容,循环也会启动。此外,hasNextInt()API还提到 扫描仪不会超过任何输入 这是什么意思?这和它有什么关系吗?Scanner input=new Scanner(System.in)不是阻塞调用,它只是创建一个新的S
Scanner input = new Scanner(System.in);
while (input.hasNextInt()) {
input.next();
}
为什么即使输入没有任何内容,循环也会启动。此外,hasNextInt()API还提到
扫描仪不会超过任何输入
这是什么意思?这和它有什么关系吗?
Scanner input=new Scanner(System.in)
不是阻塞调用,它只是创建一个新的Scanner,将STDIN
作为输入。因此,执行继续进行while循环
从API文档
如果此扫描仪的输入中有另一个令牌,则返回true。此方法在等待输入扫描时可能会阻塞。扫描仪不会超过任何输入
扫描仪等待(input.hasNextInt()
此时实际上是一个阻塞调用),以便用户输入一些内容并按Enter键
然后在input.next()
调用中,它实际读取输入(使用输入)并前进读取位置
但是,如果在终端或控制台中键入类似于
12 hello
的内容作为输入,这将导致while循环循环一次,然后退出。原因是hasNextInt()
一直读取到第一个空格,并检查空格之前的字符是否为有效的int
。在本例中,它们是,并且hasnetint()
返回true
。然后,在循环的第二次迭代中,它遇到了一个字符串
,因此hasnetint()
返回false
,从而导致循环结束。该API不是只适用于hasNext()而不适用于hasnetint()?另外,你们有关于阻止通话的好文章吗?我正在读的那本书没有提到任何关于阻止调用的内容。例如,当您在while循环中进行第一次调用时,hasnetlong()、hasnetbyte()和hasnetshort()会阻止调用。现在我必须告诉你们,若你们在终端上输入“12hello”,这将导致while循环一次,然后存在。原因是hasNext*()一直读到第一个空格并检查其int,然后在第二个循环中遇到字符串,因此hasNextInt()返回false,导致循环中断。我认为没有一本书专门介绍阻塞调用,但是大多数与IO相关的调用都是阻塞调用,除非您有一些JavaNIOS库