【问题标题】:How Scanner.next() interact with user input [duplicate]Scanner.next() 如何与用户输入交互
【发布时间】:2016-01-22 05:04:50
【问题描述】:

我发现了一个严重的问题,可以使用以下代码进行复制:

Scanner scanner = new Scanner(System.in);
System.out.println("First entry:");
System.out.println("->" + scanner.next());
System.out.println("Second entry:");
System.out.println("->" + scanner.nextLine());

如果用户条目是“a”,对nextLine() 的调用将捕获一个空字符串。我在[1][2] 的其他帖子中发现了为什么会发生这种情况。 next() 调用只在行尾留下 '\n' 字符。

我不明白为什么以下代码有效:

System.out.println("First entry:");
System.out.println("->" + scanner.next());
System.out.println("Second entry:");
System.out.println("->" + new Scanner(System.in).nextLine());

示例:

对于输入“a Hello World”,第一个块在 next() 调用中获取“a”,在 nextLine() 调用中获取“Hello World”。

但在第二个代码块中,在 next() 调用中获取“a”,但在 nextLine() 调用中“丢弃”“Hello World”并等待用户再次提示

*我知道为什么在第一个代码块中 nextLine() 调用得到一个空字符串

【问题讨论】:

  • new Scanner(System.in) 创建一个从头开始解析的新对象。
  • 第一个 Scanner 实例“锁定”了最后一行或类似的东西?它究竟从什么开始解析呢?
  • @NayukiMinase 这不是那个问题的重复,我只是没有更好的标题来使用

标签: java


【解决方案1】:

当您使用Scanner.next() 时,您需要小心按“回车”/“回车”键。一旦你这样做,扫描仪将读取输入作为回车空行。

如果您使用输入运行您的第一个代码示例

“一个”你好世界

,它应该仍然有效。

对于您的第二个示例,当您创建一个新的扫描仪时,即使您按下回车键,它也会读取输入

【讨论】:

    【解决方案2】:

    new Scanner(System.in) 将创建一个新对象并从头开始解析。

    检查下面的代码。

        Scanner scanner = new Scanner(System.in);
        System.out.println("First entry:");
        System.out.println("->" + scanner.nextLine());
        System.out.println("Second entry:");
        System.out.println("->" + scanner.nextLine());
    

    这两种情况都适用。

    【讨论】:

      猜你喜欢
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      相关资源
      最近更新 更多