java - 奇怪的 Java StackOverflowError?

标签 java stack-overflow

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

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/

相关文章:

c# - 发生类型为 'System.StackOverflowException' 的未处理异常

delphi - Delphi 中的堆栈溢出

c++ - 从堆栈中删除多余的变量 - C++

c# - 追踪我的 LINQ 查询中的堆栈溢出错误

java - 我应该尽可能使用并行流吗?

java - 注意 : android. support.v4.app.NotificationCompat Jellybean 调用 'Field.getType'

java - 如何将字节转换为blob

c# - Stackoverflow - 具有构造函数和初始值设定项的两个类之间的无限递归

java - 关于Android xmlns

java - 失败后继续执行然后如果至少有一个失败则整个测试失败