问题集--栈异常StackOverFlow
报错信息
Exception in thread "main" java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:125)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at com.chasing.entity.TestBugEntity.toString(TestBugEntity.java:5)
是一个栈溢出的问题
问题原因和复现
是由于开发中使用到了neo4j图数据库,里面的数据结构看上去类似链表,如下图:
而我们的数据中出现了一些数据的循环链,而对应的实体类是一个自己依赖自己的结构,类结构如下:
@Data
public class TestBugEntity {
private Long id;
private TestBugEntity testBugEntity;
}
由于递归引起,一个实体类中的一个属性是这个实体类本身
在这种场景下,如果出现一个循环依赖,而此时使用了@Data的注解,A的toString()方法会调用B的toString(),而B的toString()会调用A的toString()
这样会出现一个无限循环调用将会导致栈溢出
public static void testMethod() {
TestBugEntity testBugEntity1 = new TestBugEntity();
TestBugEntity testBugEntity2 = new TestBugEntity();
testBugEntity1.setId(1L);
testBugEntity2.setId(2L);
//给entity2赋值entity1
testBugEntity1.setTestBugEntity(testBugEntity2);
//给entity1赋值entity2
testBugEntity2.setTestBugEntity(testBugEntity1);
System.out.println(testBugEntity1.toString());
}
浙公网安备 33010602011771号