2017-04-10 71 views
2

我有在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); 
} 

无限递归循环在这一段代码它按预期显示计算器错误,但如果我看在控制台输出的误差是显示在多行中:

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 

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

+3

可能会缓存'stdout',并在它到达时打印'stderr'中的内容,然后在崩溃后刷新stdout。 – AntonH

+3

这是因为错误被写入'stderr',而输出写入'stdout'。那些可能不会很好地同步。 –

回答

6

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

其实程序停止在第一个stackoverflow例外。但例外情况被写入stderr频道(so System.err.println(..)),而您将输出打印到stdout频道。

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

你可以改变你的程序打印到stderr还有:

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

现在,在数据被写入到通道的顺序也应该在其所在终端上显示的顺序。