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

Java内部类代码触发StackOverflowError,求修正实现预期输出

解决Java代码的StackOverflowError问题

嘿,我来帮你搞定这个栈溢出的问题!咱们先拆解一下代码里的问题根源:

当你在main方法里创建new A()时,会触发A的实例初始化块(就是那个不带static的大括号代码),里面执行了new B();而B的实例初始化块又去执行new A().new C()——这就又回到了创建A的步骤,A再创建B,B再创建A……无限递归下去,栈内存很快就被耗尽,自然抛出Exception in thread "main" java.lang.StackOverflowError了。

修正方案:打破无限循环链条

我们需要调整逻辑,避免在B的初始化过程中重新创建新的A实例,而是复用已经存在的A实例。具体修改如下:

class A {
    {
        new B(this); // 将当前已创建的A实例传递给B
    }

    static class B {
        // 修改B的构造方法,接收外部传入的A实例
        public B(A aInstance) {
            aInstance.new C(); // 使用传入的A实例创建C,而非重新new A
        }
    }

    class C {
        {
            System.out.println("Expected output");
        }
    }
}

public class MainClass {
    public static void main(String[] args) {
        new A();
    }
}

修正说明:

  1. 给B添加了带参数的构造方法,用来接收已经初始化好的A实例
  2. 在A的初始化块里,创建B时把当前的this(也就是正在创建的A实例)传进去
  3. B内部不再重新创建新的A,而是用传入的A实例去创建内部类C,彻底切断了无限递归的循环

这样运行代码就能正常输出Expected output啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:19:30