我在java中有一个无限的递归循环
public void infiniteLoop(Long x){
System.out.println(""+x);
infiniteLoop(x + 1);
}
public static void main(String[] args) {
StackOverFlow st = new StackOverFlow();
st.infiniteLoop(0L);
}
在这段代码中,它会按预期显示StackOverFlow错误,但如果我查看控制台输出,则会以多行显示错误:
4806
4807
4808
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
at java.io.PrintStream.write(PrintStream.java:526)
at java.io.PrintStream.print(PrintStream.java:669)
at java.io.PrintStream.println(PrintStream.java:806)
at stackoverflow.StackOverFlow.infiniteLoop(StackOverFlow.java:234809
)
at stackoverflow.StackOverFlow.infiniteLoop(StackOverFlow.java:24)
at stackoverflow.StackOverFlow.infiniteLoop(StackOverFlow.java:24)
4810
4811
4812
我的问题是,为什么会发生这种情况?一旦显示第一个Stack Overflow错误,它应该不会停止吗?
1 回答
实际上程序在第一个stackoverflow异常停止 . 但是 exceptions are written to the stderr channel (所以
System.err.println(..)
)而您将输出打印到stdout
Channels .终端监听两个 Channels 并且旨在以良好的方式打印它们,但由于这些是单独的 Channels ,因此不能保证制作者写入 Channels 的顺序正确显示:各个 Channels 的顺序始终是正确,但如果数据同时写入两个通道(几乎),则流可能会混淆一点 .
您可以更改程序以打印到
stderr
:现在,数据写入通道的顺序也应该是它在终端上显示的顺序 .