如何解决程序在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");
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。