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运行它,它甚至不需要数字。在这种情况下,问题不在您的循环中:)您可以共享更多的代码,以便我们了解问题的确切位置吗?正如您在历史中可能注意到的,我不确定是先进先出还是先进后出。即使他们有确凿的理由,我也常常搞不清楚第一个是什么意思,是按时间顺序还是按缓冲区的顺序。谢谢你的回答,但我的问题还是一样。我甚至不能输入一个字符这一事实是显而易见的。正如你在历史上可能注意到的,我不确定是先进先出还是先进后出。即使他们有确凿的理由,我也常常搞不清楚第一个是什么意思,是按时间顺序还是按缓冲区的顺序。谢谢你的回答,但我的问题还是一样。我甚至不能输入一个字符这一事实是显而易见的。