无限递归函数 - >堆栈溢出错误



我在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

我的问题是,为什么会发生这种情况? 一旦显示第一个堆栈溢出错误,它不应该立即停止吗?

[S]一旦显示第一个堆栈溢出错误,它就不会停止吗?

实际上,程序在第一个堆栈溢出异常时停止。但是例外情况会写入stderr通道(所以System.err.println(..)(,而您将输出打印到stdout通道。

终端侦听两个通道

并旨在以良好的方式打印它们,但由于这些是单独的通道,因此无法保证生产者写入通道的顺序正确显示:各个通道的顺序始终正确,但如果数据(几乎(同时写入两个通道, 流可能会有点混淆。

您也可以更改程序以打印到stderr

public void infiniteLoop(Long x){
    System.err.println(""+x); // error channel.
    infiniteLoop(x + 1);
}

现在,数据写入通道的顺序也应该是它在终端上的显示顺序。

最新更新