为什么这段代码会完全破坏输出?
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.
最佳答案
该问题类似于此问题中的问题:Stack overflow error handling in finally block
基本上,println
调用您的 StackOverflowException
处理程序会触发进一步的 StackOverflowException
。这是在对 rec()
的封闭调用中处理的。这将继续(展开 rec()
调用)直到异常处理程序有足够的空间来完成 println 调用。中间调用可能是将字符添加到输出缓冲区,然后引发 SOE。
精确的解释需要对 PrintStream 和流堆栈的代码进行取证分析......一直到它调用 native 代码的地方。
如果你想要元解释,那就是你的代码正试图从 Error
中恢复......javadocs 说这是你不应该尝试做的事情。作为一般规则,在 Error
之后,JVM 将处于不确定且可能已损坏的状态。在这种情况下,不确定性表现为可能已或可能未写入缓冲区的数据。该行为(可能)是确定性的,但如果不进行适当的分析,肯定很难分析并且无法预测。
关于java - 奇怪的 Java StackOverflowError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22616518/