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

TestNG项目出现java.lang.StackOverflowError的问题排查与解决

问题分析与修复方案

问题根源

你遇到的java.lang.StackOverflowError是因为两个页面对象类在初始化阶段形成了无限循环依赖:

  • TextEditorTabPage的构造方法(或类成员变量初始化)中实例化了VisualEditorTabPage
  • 而VisualEditorTabPage的构造方法(或类成员变量初始化)又反过来实例化TextEditorTabPage
  • 这个过程会无限递归执行,直到JVM栈内存耗尽,抛出栈溢出错误

举个典型的错误代码示例:

// 错误的TextEditorTabPage实现
public class TextEditorTabPage {
    // 类加载时直接实例化VisualEditorTabPage
    private VisualEditorTabPage visualTab = new VisualEditorTabPage();

    public TextEditorTabPage() {
        // 或者在构造方法中实例化对方
        // visualTab = new VisualEditorTabPage();
    }
}

// 错误的VisualEditorTabPage实现
public class VisualEditorTabPage {
    private TextEditorTabPage textTab = new TextEditorTabPage();

    public VisualEditorTabPage() {
        // textTab = new TextEditorTabPage();
    }
}

修复方案

1. 延迟实例化(懒加载)

不在类初始化或构造方法中创建对方实例,而是在实际需要使用时再初始化,并手动建立双向引用,避免循环创建:

public class TextEditorTabPage {
    private VisualEditorTabPage visualTab;

    public VisualEditorTabPage getVisualEditorTabPage() {
        if (visualTab == null) {
            visualTab = new VisualEditorTabPage();
            visualTab.setTextEditorTabPage(this);
        }
        return visualTab;
    }

    public void setVisualEditorTabPage(VisualEditorTabPage visualTab) {
        this.visualTab = visualTab;
    }
}

public class VisualEditorTabPage {
    private TextEditorTabPage textTab;

    public TextEditorTabPage getTextEditorTabPage() {
        if (textTab == null) {
            textTab = new TextEditorTabPage();
            textTab.setVisualEditorTabPage(this);
        }
        return textTab;
    }

    public void setTextEditorTabPage(TextEditorTabPage textTab) {
        this.textTab = textTab;
    }
}

2. 外部依赖注入

由测试类(或外部管理容器)负责创建两个页面对象,并手动建立它们的引用关系,完全避免页面对象自行实例化对方:

public class Testclass {
    @Test
    public void testEditorTabs() {
        // 先分别创建两个页面对象
        TextEditorTabPage textTab = new TextEditorTabPage();
        VisualEditorTabPage visualTab = new VisualEditorTabPage();
        
        // 手动绑定双向引用
        textTab.setVisualEditorTabPage(visualTab);
        visualTab.setTextEditorTabPage(textTab);
        
        // 执行测试逻辑
        textTab.enterText("test content");
        visualTab.previewContent();
    }
}

3. 移除不必要的双向引用

如果业务逻辑不需要两个页面对象互相持有引用,直接删除其中一个类里对另一个类的实例化代码,只保留单向引用即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:48:21