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

时间:2017-04-10 17:11:28

标签: java recursion netbeans stack stack-overflow

我在java中有一个无限的递归循环

dos2unix

在这段代码中,它会按预期显示StackOverFlow错误,但如果我查看控制台输出,错误会以多行显示:

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); 
}

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

1 个答案:

答案 0 :(得分:6)

  

[S]一旦显示第一个Stack Overflow错误,它就不会停止吗?

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

终端收听两个频道并打算以良好的方式打印它们,但由于这些是单独的频道,因此 no 保证生成器写入频道的顺序显示正确:各个通道的顺序始终是正确的,但如果数据同时写入两个通道,那么这些流可能会混淆一点。

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

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

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