Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果hasNextInt()没有任何内容,则Scanner hasNextInt()返回true_Java_Java.util.scanner - Fatal编程技术网

Java 如果hasNextInt()没有任何内容,则Scanner hasNextInt()返回true

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

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

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库