You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

捕获StackOverflowError实现无限递归?Java递归栈溢出问题探究

为什么捕获StackOverflowError后递归能持续运行?

核心原因是Java的异常处理机制会在捕获错误时自动展开栈,释放栈空间,让程序可以重新发起递归调用。

具体原理拆解:

  1. 未捕获溢出的情况:
    当递归调用不断创建栈帧,耗尽JVM分配的栈空间时,会直接抛出StackOverflowError,由于没有捕获,JVM会终止程序,此时的递归次数就是单次递归能达到的最大深度(约40000次)。

  2. 捕获溢出的情况:
    当错误被catch块捕获时,JVM会执行栈展开操作——将导致溢出的所有递归栈帧全部销毁,栈空间会回退到try块所在方法(比如main方法)的状态。此时栈空间已经被释放,catch块里再次调用递归方法,相当于重新开始一轮全新的递归,新一轮递归又可以消耗栈空间直到再次溢出,如此循环往复。

    你看到的4072342次,其实是多轮递归调用的次数总和,而非单次递归的深度。每一轮递归都会在栈溢出后被重置,所以程序能持续运行下去。

对应逻辑的示例代码:

public class RecursiveLoopDemo {
    private static long totalCount = 0;

    public static void main(String[] args) {
        while (true) {
            try {
                recursiveCall();
            } catch (StackOverflowError e) {
                // 栈展开后空间释放,重新发起递归
                // 注:实际代码可能直接在catch里再次调用递归,逻辑本质一致
            }
        }
    }

    private static void recursiveCall() {
        totalCount++;
        recursiveCall();
    }
}

关键提醒:

这种做法完全是利用了异常处理的边缘特性,Java官方明确不建议捕获StackOverflowError这类严重错误——异常处理的开销极大,且栈展开可能导致部分资源无法正常释放,甚至引发JVM状态不稳定,属于非常不规范的编程方式。

内容的提问来源于stack exchange,提问作者Futarimiti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:55:04