我在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错误,它不应该停止吗?
答案 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);
}
现在,数据写入频道的顺序也应该是它在终端上显示的顺序。