gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:48:21 28 4
gpt4 key购买 nike

我在 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

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

最佳答案

[S]houldn't it stops as soon as the first Stack Overflow error is displayed?

实际上程序在 第一个 stackoverflow 异常处停止。但是异常被写入stderr channel (所以System.err.println(..))而你打印输出到标准输出 channel 。

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

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

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

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

关于java - 无限递归函数 -> 堆栈溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43329152/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com