扫描仪比打印更快?

时间:2020-06-25 18:55:11

标签: java java.util.scanner

我遇到了一个奇怪的问题。

到目前为止,我的代码如下:

String value = "";
Scanner scanner = new Scanner(System.in);

System.out.print("String 1");
System.out.println("String 2");
value = scanner.nextLine();

当我看到这个时,我希望程序打印以下内容

String 1String 2

然后它应该等我输入一些东西。

但是当我运行代码时,它会说:

Exception in thread "main" String 1String2
java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)

然后它告诉我发生错误的那一行。

在我看来,扫描仪似乎在打印字符串之前尝试扫描某些东西。 为什么会这样?

1 个答案:

答案 0 :(得分:2)

发生排序问题是因为字符串被写入stdout,而异常(由于环境不允许键盘输入)被写入stderr。

虽然首先写入字符串,但是这两段数据最终在两个不同的队列(可能是管道缓冲区)中结束,它们之间没有固有的顺序。然后,显示的顺序取决于环境如何/何时从两个队列中读取输出并将它们合并以显示。

如果想要可预测的排序,则必须将两者都写入同一基础流,因为要对单个流中的内容进行排序。

您可以从Java端通过将字符串写入stderr(例如改为System.err.println)来实现,也可以从环境端通过确保stdout和stderr指向同一流(例如shell {{1})来做到这一点。 })