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
相关产品推荐
相关产品推荐

