【问题标题】:Scanner not working in loop扫描仪不循环工作
【发布时间】:2017-04-23 20:31:48
【问题描述】:

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

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”时,它返回所有数字的总和。 (我将存储代码分开,与问题无关)

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

编辑: 显然,在 testing 时运行此循环不起作用。我在 main() 上试了一下,效果很好。感谢您的回答!

【问题讨论】:

  • no 无限循环,代码显示。当输入 0 时,循环将按预期终止。
  • 你的问题是什么,你想解决什么问题?
  • 欢迎来到 Stack Overflow。问题中的代码不完整。您需要提供指示 scanner 类型的代码以及它如何获取其值。没有这些,只能根据假设回答您的问题。请咨询stackoverflow.com/help/mcve 以改进问题。
  • @OusmaneMahyDiaw 是。我用 JUnit 运行它,它甚至不要求一个数字。
  • 在这种情况下,问题不在您的循环中 :) 您能否分享更多代码,以便我们了解问题的确切位置?

标签: java loops java.util.scanner infinite


【解决方案1】:

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

为了识别数字的结尾,扫描仪正在等待某个不是数字的字符。 Enter 就是这样一个无数字,表示您喜欢使用nextInt 读取的数字的结尾。不幸的是,Enter 也是可以读取的String

如果您输入 20Enter20 是数字的一部分,但 Enter 是String 的一部分,但仍然在缓冲区中。所以在20 之后,缓冲区包含一个 Enter ,这不是一个数字。因为那不是一个数字,所以第二个readInt 一直在等待!

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

例子:

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
}

希望有帮助

【讨论】:

  • 正如您在历史上可能注意到的那样,我不确定是先进先出还是先进后出。即使他们有充分的理由,我也经常混淆第一个是什么意思,按时间顺序还是按缓冲区的顺序。
  • 感谢您的回答,但我的问题仍然存在。我什至不能输入字符这一事实很明显。
猜你喜欢
  • 1970-01-01
  • 2016-02-06
  • 2012-09-27
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多