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(); } }
修正说明:
- 给
B添加了带参数的构造方法,用来接收已经初始化好的A实例 - 在
A的初始化块里,创建B时把当前的this(也就是正在创建的A实例)传进去 B内部不再重新创建新的A,而是用传入的A实例去创建内部类C,彻底切断了无限递归的循环
这样运行代码就能正常输出Expected output啦!
内容的提问来源于stack exchange,提问作者Udaya Kumar
相关产品推荐
相关产品推荐

