无限递归函数 -> 堆栈溢出错误
Infinite recursive function -> Stack Overflow error
我在 java
中有一个无限递归循环
public void infiniteLoop(Long x){
System.out.println(""+x);
infiniteLoop(x + 1);
}
public static void main(String[] args) {
Whosebug st = new Whosebug();
st.infiniteLoop(0L);
}
在这段代码中,它按预期显示了 Whosebug 错误,但如果我查看控制台输出,则错误显示为多行:
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 Whosebug.Whosebug.infiniteLoop(Whosebug.java:234809
)
at Whosebug.Whosebug.infiniteLoop(Whosebug.java:24)
at Whosebug.Whosebug.infiniteLoop(Whosebug.java:24)
4810
4811
4812
我的问题是,为什么会发生这种情况?它不应该在显示第一个 Stack Overflow 错误时立即停止吗?
[S]houldn't it stops as soon as the first Stack Overflow error is displayed?
实际上程序在 第一个 Whosebug 异常 处停止。但是 异常被写入 stderr
通道 (因此 System.err.println(..)
),而您将输出打印到 stdout
通道。
终端监听两个通道并旨在以良好的方式打印它们,但由于这些是单独的通道,因此没有保证生产者写入的顺序正确显示通道:各个通道的顺序始终正确,但如果数据(几乎)同时写入两个通道,则流可能会有点混淆。
您也可以更改程序以打印到 stderr
:
public void infiniteLoop(Long x){
System.<b>err</b>.println(""+x); // error channel.
infiniteLoop(x + 1);
}
现在写入通道的顺序也应该是在终端显示的顺序。
我在 java
中有一个无限递归循环public void infiniteLoop(Long x){
System.out.println(""+x);
infiniteLoop(x + 1);
}
public static void main(String[] args) {
Whosebug st = new Whosebug();
st.infiniteLoop(0L);
}
在这段代码中,它按预期显示了 Whosebug 错误,但如果我查看控制台输出,则错误显示为多行:
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 Whosebug.Whosebug.infiniteLoop(Whosebug.java:234809
)
at Whosebug.Whosebug.infiniteLoop(Whosebug.java:24)
at Whosebug.Whosebug.infiniteLoop(Whosebug.java:24)
4810
4811
4812
我的问题是,为什么会发生这种情况?它不应该在显示第一个 Stack Overflow 错误时立即停止吗?
[S]houldn't it stops as soon as the first Stack Overflow error is displayed?
实际上程序在 第一个 Whosebug 异常 处停止。但是 异常被写入 stderr
通道 (因此 System.err.println(..)
),而您将输出打印到 stdout
通道。
终端监听两个通道并旨在以良好的方式打印它们,但由于这些是单独的通道,因此没有保证生产者写入的顺序正确显示通道:各个通道的顺序始终正确,但如果数据(几乎)同时写入两个通道,则流可能会有点混淆。
您也可以更改程序以打印到 stderr
:
public void infiniteLoop(Long x){
System.<b>err</b>.println(""+x); // error channel.
infiniteLoop(x + 1);
}
现在写入通道的顺序也应该是在终端显示的顺序。