Odd Java StackOverflowError?

2022-09-04 22:22:14

为什么此代码会完全破坏输出?

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.


答案 1

问题与此问题中的问题类似:最终块中的堆栈溢出错误处理

基本上,您的处理程序的调用将触发进一步的 .这将在对 的封闭调用中处理。这将继续(在我们进行时展开调用),直到异常处理程序有足够的空间来完成 println 调用。中间调用可能会向输出缓冲区添加字符,然后引发 SOE。printlnStackOverflowExceptionStackOverflowExceptionrec()rec()

精确的解释需要对PrintStream的代码和流堆栈进行取证分析......一直到它调用本机代码的点。


如果你想要一个元解释,那就是你的代码正试图从...Javadocs说这是你不应该尝试做的事情。作为一般规则,在 之后,JVM 将是一个不确定的,并且可能是断开的状态。在这种情况下,不确定性表现为可能已写入或未写入缓冲区的数据。这种行为(可能)是确定性的,但绝对难以分析,如果没有适当的分析,也不可能预测。ErrorError


答案 2

推荐