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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:12:46