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

代码无递归却持续出现java.lang.StackOverflowError,求解决

问题原因与修复方案

核心问题:无限递归构造对象

你遇到的StackOverflowError并非来自显式递归,而是类继承关系引发的无限构造循环:

  • ServingButtons继承了MainFrame,创建ServingButtons实例时,会先调用父类MainFrame的构造函数
  • 但MainFrame的构造函数里又执行了new ServingButtons(),这会再次触发MainFrame的构造逻辑,循环往复直到栈内存耗尽

此外代码还有两个次要问题:

  1. MainFrame中food数组初始化顺序错误:数组在静态常量定义前就被初始化,会触发编译错误
  2. ServingButtons不需要继承MainFrame——它本质是一个包含按钮的面板,应该继承JPanel而非JFrame

修复步骤

1. 修正类继承关系

将ServingButtons的父类从MainFrame改为JPanel:

package sweets;

import javax.swing.*;
import java.awt.*;

public class ServingButtons extends JPanel {
    // 原有成员变量、构造函数代码保持不变
}

2. 调整MainFrame中静态常量与数组的顺序

把静态常量定义移到数组初始化之前:

package sweets;

import javax.swing.*;
import java.awt.*;

public class MainFrame extends JFrame {
    // 先定义静态常量
    final static String bananaBread = "banana bread";
    final static String brownies = "brownies";
    final static String chocolateChipcookies = "chocolate chip cookies";
    final static String macarons = "macarons";
    // 再初始化数组
    String[] food = {bananaBread, brownies, chocolateChipcookies, macarons};

    // 原有构造函数代码保持不变
}

3. 完善ServingButtons的组件挂载(可选)

由于ServingButtons现在是JPanel子类,需要在构造函数里将servings面板添加到自身:

public ServingButtons() {
    servings.setLayout(new GridLayout(1, 4));
    // 原有按钮、标签创建逻辑不变...
    
    // 添加这行代码,将servings面板挂载到当前ServingButtons实例中
    this.add(servings);
}

修复后流程说明

  • 启动程序创建MainFrame实例时,构造函数会创建ServingButtons(现在是JPanel子类)
  • ServingButtons的构造不会再触发MainFrame的构造逻辑,循环被彻底打破
  • 静态常量先定义,数组能正确获取到常量值,避免编译错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:02:34