>堆栈溢出错误

在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]一旦显示第一个堆栈溢出错误就不会停止?

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

终端收听两个频道,目的是以良好的方式打印它们,但由于这些是单独的频道,因此不能保证制作人写入频道的顺序能够正确显示:单个频道的顺序始终是正确的,但如果数据同时写入两个通道(几乎),则这些数据流可能会混合一点。

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

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

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

链接地址: http://www.djcxy.com/p/80461.html

上一篇: > Stack Overflow error

下一篇: When does StackOverflowError occur?