代码无递归却持续出现java.lang.StackOverflowError,求解决
问题原因与修复方案
核心问题:无限递归构造对象
你遇到的StackOverflowError并非来自显式递归,而是类继承关系引发的无限构造循环:
ServingButtons继承了MainFrame,创建ServingButtons实例时,会先调用父类MainFrame的构造函数- 但
MainFrame的构造函数里又执行了new ServingButtons(),这会再次触发MainFrame的构造逻辑,循环往复直到栈内存耗尽
此外代码还有两个次要问题:
MainFrame中food数组初始化顺序错误:数组在静态常量定义前就被初始化,会触发编译错误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
相关产品推荐
相关产品推荐

