Java中实例化TestList对象时出现StackOverflowError问题求助
解决TestList实例化时的StackOverflowError问题
兄弟,你这问题的根源一眼就能看出来——无限递归调用构造函数!
咱们来拆解下问题:当你在main里创建TestList t = new TestList()的时候,会调用TestList的无参构造函数。而你在这个构造函数里写了tList = new TestList();,这就意味着每创建一个TestList对象,它都会立刻再创建一个新的TestList对象赋值给自己的tList属性。
这个过程会无限重复下去:创建t → 调用构造函数 → new TestList() → 又调用构造函数 → 再new TestList()……直到JVM的调用栈被填满,直接抛出StackOverflowError。
修复方案(满足必须使用TestList类型对象的要求)
根据你的业务需求,这里给你几个可行的修复方向:
方案1:懒加载tList(用到的时候再创建)
如果tList不是必须在构造时就初始化,可以改成需要使用它的时候再实例化,避免一开始就递归:
public class TestList extends ArrayList<Test> { protected TestList tList; public TestList() { // 构造函数里不再直接创建tList } // 新增一个获取tList的方法,用到时才初始化 public TestList getTList() { if (tList == null) { tList = new TestList(); } return tList; } }
方案2:让tList指向当前实例(如果业务允许)
如果tList的作用是引用当前对象本身,那直接赋值this就行,不用新创建实例:
public class TestList extends ArrayList<Test> { protected TestList tList; public TestList() { tList = this; // 指向当前创建的实例,避免递归 } }
方案3:通过构造参数控制递归终止
如果确实需要创建另一个TestList实例,但得给递归加个终止条件,比如用私有构造函数区分:
public class TestList extends ArrayList<Test> { protected TestList tList; // 对外暴露的无参构造,不创建内部tList public TestList() { this(false); } // 私有构造函数,控制是否初始化tList private TestList(boolean createInner) { if (createInner) { tList = new TestList(); // 这里调用无参构造,不会触发递归 } } // 如果需要创建带内部tList的实例,可以加个方法 public static TestList createWithInnerList() { return new TestList(true); } }
核心思路
不管选哪种方案,核心都是打破构造函数里的无限递归链,别让TestList的构造函数不停触发新的TestList实例创建。
内容的提问来源于stack exchange,提问作者user14358151
相关产品推荐
相关产品推荐

