无限递归函数 - > Stack Overflow错误

Seb*_*dro 2 java stack-overflow recursion stack netbeans

我在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); 
}
Run Code Online (Sandbox Code Playgroud)

在这段代码中,它会按预期显示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
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么会发生这种情况?一旦显示第一个Stack Overflow错误,它是否应该停止?

Wil*_*sem 6

只要显示第一个Stack Overflow错误,它就不会停止吗?

实际上程序在第一个stackoverflow异常停止.但是将异常写入stderr通道(so System.err.println(..)),而将输出打印到stdout通道.

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

您可以更改您的程序以进行打印stderr:

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

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