Method threw ‘java.lang.StackOverflowError‘ exception. Cannot evaluate 问题

网友投稿 763 2022-12-01

Method threw ‘java.lang.StackOverflowError‘ exception. Cannot evaluate 问题

一、背景

今天在做项目中发现A类与B类的关系是1:n,即A类中有一个List bList的成员变量,B类中有一个A a的成员变量。

当执行A.getBList().add(b)方法时会报错:Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate com.saint.start.gaia.A.toString()

二、原因

StackOverFlow问题,顾名思义是栈溢出的意思,Java虚拟机在实际调用方法时会设置最大栈深度,防止其暴走直接占用满所有内存。

根本上是因为实例之间的互相引用!和Spring中的循环依赖很相似。

因为Debugger会调用对象的toString()方法以显示对象中的所有数据信息。然后,我的所有对象都使用lombok的@Data注解重写了toString()方法。问题就出在这里,这意味着程序会不断地调用A类和B类的toString()方法,永不停止,结果就造成了StackOverFlow的问题。

三、解决方案

在类中重写toString()方法,不打印互相引用的类成员变量,避免这种循环调用的产生。

四、实例

// A类import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.util.List;/** * @author@Data@AllArgsConstructor@NoArgsConstructorpublic class Address{ private String name; private List userList; @Override public String toString(){ return name; }}// B类/** * @author@Data@AllArgsConstructor@NoArgsConstructorclass User{ private String name; private Address address; @Override public String toString(){ return name; }}// main方法public class Main{ public static void main(String[] args){ Method m = new Method(); Address address = new Address("nanjing", new ArrayList<>()); User ha = new User("ha", address); address.getUserList().add(ha); User user = new User("start", address); address.getUserList().add(user); }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:JPA之映射mysql text类型的问题
下一篇:20G大文件使用Java高效进行外排,算法 = 败者树 + 多路归并排序
相关文章

 发表评论

暂时没有评论,来抢沙发吧~