程序在Scanner#nextLine没有收到“空白”或“输入”之前不会打印任何内容 输入输出

问题描述

Scanner in = new Scanner(system.in);
while (in.hasNext()) {
    String a = in.nextLine();
    System.out.println(a + " 1");
}

我只是想检查当输入为SPACE或ENTER时会发生什么,但是直到我的输入既不是SPACE也不是ENTER时,它不会打印任何内容

a                     // input 
a 1                   // output 
                      // SPACE(input) 
c                     // input
  1                   // output
c 1                   // output

为什么直到它读取既不是空白也不是空格的东西时才打印?同样,当它最终打印时,它打印出空格c,它是c 1之前的行,当我输入c时,它给我1和c 1。

解决方法

Java Scanner hasNext() vs. hasNextLine():

也就是说,hasNext()检查输入,如果它还有另一个non-whitespace字符,则返回true。
Whitespace不仅包括空格字符,还包括制表符(\ t),换行符(\ n)以及更多字符。
连续的空白字符被视为单个定界符。

System.in 表示标准输入
当您通过 System.in 初始化 Scanner 时,它将从 Standard Input 中读取数据。
并且它将一直等待输入,除非您的输入是EOF中的Windows Ctrl + Z Ctrl + D )。
因此,扫描程序将始终等待输入中的非空白字符。

输入

当您按 Space Enter 时,它将向发送两个空格字符 \n标准输入,并且函数scanner.hasNext()仍在等待非空白字符。并且scanner.hasNext()不返回任何内容。这就是为什么目前没有输出的原因。
然后按 c ,它将非空白字符c发送到标准输入

输出

现在您的标准输入包含 \n c,第三个不是空格字符。
最后,函数scanner.hasNext() 返回true
然后scanner.nextLine()读一行直到字符\n:它将是 (一个字符),
并打印 1

标准输入现在变为c,只有一个字符,
这将导致scanner.hasNext()再次返回true:
扫描程序将读取一行,该行将是一个字符c
并打印c 1

,

正如@Savior在此post中提到的:

hasNext()检查缓冲区中是否有可解析的令牌,由扫描仪的定界符分隔。 由于扫描仪的定界符为空白,并且linePattern也是空白,因此缓冲区中可能有一个linePattern但没有可解析的标记。

考虑使用hasNextLine()

public class Main {
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String a = in.nextLine();
            System.out.println(a + " 1");
        }
    }
}