我遇到了一个奇怪的问题。
到目前为止,我的代码如下:
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)
然后它告诉我发生错误的那一行。
在我看来,扫描仪似乎在打印字符串之前尝试扫描某些东西。 为什么会这样?
答案 0 :(得分:2)
发生排序问题是因为字符串被写入stdout,而异常(由于环境不允许键盘输入)被写入stderr。
虽然首先写入字符串,但是这两段数据最终在两个不同的队列(可能是管道缓冲区)中结束,它们之间没有固有的顺序。然后,显示的顺序取决于环境如何/何时从两个队列中读取输出并将它们合并以显示。
如果想要可预测的排序,则必须将两者都写入同一基础流,因为要对单个流中的内容进行排序。
您可以从Java端通过将字符串写入stderr(例如改为System.err.println
)来实现,也可以从环境端通过确保stdout和stderr指向同一流(例如shell {{1})来做到这一点。 })