Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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 扫描仪不在循环中工作_Java_Loops_Java.util.scanner_Infinite - Fatal编程技术网

Java 扫描仪不在循环中工作

Java 扫描仪不在循环中工作,java,loops,java.util.scanner,infinite,Java,Loops,Java.util.scanner,Infinite,经过测试,我发现这个小循环永远不会结束: Scanner scanner = new Scanner(System.in); int c = 1; // initialize variable // and then while(c != 0){ // as long as it

经过测试,我发现这个小循环永远不会结束:

Scanner scanner = new Scanner(System.in);

int c = 1;                                   // initialize variable
                                             // and then
while(c != 0){                               // as long as its not 0
    System.out.println("Enter a number: ");
    c = scanner.nextInt();                   // ask for a new value
}
这个循环发生在一个简单的程序中,我要求用户输入数字并存储它们,当他输入“0”时,它返回所有数字的总和。(我将分开存储代码,与问题无关)

这个循环永远不会结束,事实上,我甚至不能输入一个数字


编辑:显然,在测试时运行此循环不起作用。我在一台主机上试过,效果很好。谢谢你的回答

扫描仪有一个缓冲区,这个缓冲区是先进先出的,这意味着如果你想输入
20
,你必须按20。在2和0之间是一个小停顿,扫描仪不知道什么时候有更多的数字出现(您可能想输入一个
205
,所以他在等待下一个数字)

要识别数字的结尾,扫描仪正在等待非数字字符。Enter是一个no数字,表示您希望使用
nextInt
读取的数字的结尾。不幸的是,Enter也是一个可以读取的
字符串

如果输入20,则输入
20
是数字的一部分,但输入是字符串的一部分,但仍在缓冲区中。因此,在
20
之后,缓冲区包含一个Enter,而这不是一个数字。因为这不是一个数字,所以第二个
readInt
将永远等待

您可以做的是刷新缓冲区以刷新不需要的输入

例如:

int c = 1;                                   // initialize variable
                                             // and then
while(c != 0){                               // as long as its not 0
    Scanner scanner = new Scanner(System.in);// construct without buffer
    System.out.println("Enter a number: ");
    c = scanner.nextInt();                   // ask for a new value
}

希望对你有所帮助一台扫描仪有一个缓冲区,这个缓冲区是先进先出的,这意味着如果你想输入一个
20
,你必须按20。在2和0之间是一个小停顿,扫描仪不知道什么时候有更多的数字出现(您可能想输入一个
205
,所以他在等待下一个数字)

要识别数字的结尾,扫描仪正在等待非数字字符。Enter是一个no数字,表示您希望使用
nextInt
读取的数字的结尾。不幸的是,Enter也是一个可以读取的
字符串

如果输入20,则输入
20
是数字的一部分,但输入是字符串的一部分,但仍在缓冲区中。因此,在
20
之后,缓冲区包含一个Enter,而这不是一个数字。因为这不是一个数字,所以第二个
readInt
将永远等待

您可以做的是刷新缓冲区以刷新不需要的输入

例如:

int c = 1;                                   // initialize variable
                                             // and then
while(c != 0){                               // as long as its not 0
    Scanner scanner = new Scanner(System.in);// construct without buffer
    System.out.println("Enter a number: ");
    c = scanner.nextInt();                   // ask for a new value
}

希望这有帮助

显示的代码没有无限循环。当输入0时,循环将按预期终止。您有什么问题,希望解决什么问题?欢迎使用堆栈溢出。问题中的代码不完整。您需要提供指示扫描仪类型的代码,以及它如何取值。没有这些,你只能根据假设回答你的问题。请咨询以改进该问题。@OusmaneMahyDiaw它是。我用JUnit运行它,它甚至不要求数字。在这种情况下,问题不在您的循环中:)您可以共享更多代码吗?这样我们就可以了解问题的确切位置了?显示的代码没有无限循环。当输入0时,循环将按预期终止。您有什么问题,希望解决什么问题?欢迎使用堆栈溢出。问题中的代码不完整。您需要提供指示扫描仪类型的代码,以及它如何取值。没有这些,你只能根据假设回答你的问题。请咨询以改进该问题。@OusmaneMahyDiaw它是。我正在用JUnit运行它,它甚至不需要数字。在这种情况下,问题不在您的循环中:)您可以共享更多的代码,以便我们了解问题的确切位置吗?正如您在历史中可能注意到的,我不确定是先进先出还是先进后出。即使他们有确凿的理由,我也常常搞不清楚第一个是什么意思,是按时间顺序还是按缓冲区的顺序。谢谢你的回答,但我的问题还是一样。我甚至不能输入一个字符这一事实是显而易见的。正如你在历史上可能注意到的,我不确定是先进先出还是先进后出。即使他们有确凿的理由,我也常常搞不清楚第一个是什么意思,是按时间顺序还是按缓冲区的顺序。谢谢你的回答,但我的问题还是一样。我甚至不能输入一个字符这一事实是显而易见的。