【问题标题】:Scanner class' hasNext() on infinite loop扫描仪类的 hasNext() 无限循环
【发布时间】:2018-01-23 23:17:45
【问题描述】:

我正在尝试编写使用 Scanner 类来获取用户输入的代码。但是hasNext()、hasNextInt()、hasNextLine()每次都会陷入无限循环。

public static void getInput(ArrayList<Double> arr){

       Scanner input = new Scanner(System.in);
       String data = "";
       String init;
       while(input.hasNextLine()){
           init = input.nextLine();
           data += init;
       }
       .
       .
       .
   }

【问题讨论】:

  • 那么,认为它是如何工作的?什么应该告诉扫描仪没有下一行?提示:按ENTER 输入一个换行符,这算作...换行符。你知道EOF这个字符吗?
  • 你确定这是一个“无限循环”还是只是 hasNextLine 阻塞等待输入?
  • @Fureeish 我明白,但下一次迭代不应该使用换行符吗?
  • 当然它会消耗它,但是你知道当hasNext... 家族的成员发现你与System.in 绑定它并且扫描仪缓冲区中没有任何内容时会发生什么吗?它会等待输入……它会继续这样做,直到您提供一个使hasNext... 停止的字符。对于hasNextLine(),那将是end of file character。对于 hasNextInt(),它可以是任何无法转换为 int 的字符序列,依此类推...
  • @Fureeish 哦,我明白了。如何提供 EOF 字符。还是我创建自己的哨兵价值?

标签: java input java.util.scanner


【解决方案1】:

当且仅当源关闭时,在 Scanner 对象上调用 hasNextLine() 将返回 false。这可以通过在InputStream 上调用close() 来实现,如果IOExceptionScanner 尝试从源读取字节时发生,或者如果已经到达流的末尾(EOF)。虽然文件的InputStream 将在您到达末尾并收到此标记时关闭,但从System.in 读取将阻塞,直到数据可用或引发异常。

在 Unix 上,EOF 标记通常由 Ctrl-D 提供,而在 Windows 上通常是 Ctrl-Z。如果您使用的是 IDE,您可能会发现它们有所不同;例如,我的 Windows 机器上的 Intellij IDE 使用 Ctrl-D,而 Eclipse 过去曾出现过问题。

【讨论】:

  • "当您使用System.in 创建Scanner 时,它将等待下一个输入,直到收到EOF 标记。" - 这是 不正确。它将等待无法解释为有效hasNext[...] 部分的字符。 EOF 适用于一切,但您不必每次都使用它。例如,一旦出现无法解析为int 的字符,hasNextInt() 就会返回 false。
  • @Fureeish 好点。我的意思是并且应该说hasNextLine() 将阻塞直到下一个输入或Scanner 推断InputStream 被关闭。
【解决方案2】:

我知道这是旧的。为了后代的缘故,我也发布我的经验。我个人对扫描仪和 hasNext() 无限循环有疑问。当我的扫描仪基于 System.in 进行输入时,我在程序的早期调用了 Scanner.close()。删除扫描仪上的关闭,而不是实例化新的扫描仪,暂时修复它。正如评论所提到的,扫描仪在等待输入时被阻止,所以它总是读取错误。

链接到帮助我的帖子:How can I clear the Scanner buffer in Java?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2021-02-07
    相关资源
    最近更新 更多