【发布时间】:2014-03-24 17:32:15
【问题描述】:
为什么这段代码会完全破坏输出?
public class Main {
public static void main(String[] args) {
System.out.println();
rec();
}
private static int rec() {
try {
return rec();
} catch(StackOverflowError e) {
System.out.println("Boo.");
return 0;
}
}
}
我得到的示例输出:Boo.Boo.Boo.Boo.Boo.Boo.Boo.Boo.Boo.
【问题讨论】:
-
运行代码时,我只得到一个 Boo。
-
也许试着解释一下你认为这是如何应该起作用的。
-
它应该只输出
Boo. -
我的猜测是对 System.out.println 的调用可能会增加堆栈,足以导致 catch 中的另一个堆栈溢出,它会传播到下一个 rec() 调用,再次处理,打印 boo,但会导致另一个 stackoverflow 和另一个 print 等等,直到你有足够的空间 8 个左右的 rec() 调用来捕获异常并没有问题地打印。
-
@NESPowerGlove:“嘘”是有道理的。已打印但没有换行。因此,它无法打印暗示
flush的换行符,这可能比没有ln的简单print需要更多的堆栈空间。
标签: java stack-overflow