JAP出现java.lang.StackOverflowError异常

本文分析了Java中出现StackOverflowError异常的原因,通常由实体类间的循环引用引起。通过详细示例,展示了如何通过调整注解使用方式,避免toString方法的相互调用导致的死循环,从而解决异常问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAP出现java.lang.StackOverflowError异常

最终原因是因为toString相互调用的原因,导致出现了这种现象: o

@Entity
@Data
@EqualsAndHashCode(callSuper = true)
@Table(name = "xxx1_table")
public class XXX1Entity extends BaseEntity {
    private static final long serialVersionUID = -44891563261597827L; 
    /**
     * product sku attribute list
     */
    @OneToMany(mappedBy = "xxx1Obj", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<XXX2Entity> xxx2List;
}

@Entity
@Data
@EqualsAndHashCode(callSuper = true)
@Table(name = "xxx2_table")
public class XXX2Entity extends BaseEntity {
    private static final long serialVersionUID = -44891563261597827L; 
    /**
     * product sku attribute list
     */
    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH}, optional = false)
    @JoinColumn(name = "xxx1_id", referencedColumnName = "xxx1_id")
    private XXX1Entity xxx1Obj;
} 

怎么我们可以看到他们是循环引用,当我们调用XXX1Entity#toString()的时候其中会输出xxx2List这个list的#toString方法,list#toString()方法又会调用XXX2Entity#toString()方法最终导致死循环,出现StackOverflowError异常。

解决方案:
去掉@Data改为@Getter @Setter这样就不会出现这种问题了,如果你需要toString方法就自己实现就好了,但是千万不要出现这种方法的相互调用死循环就ok了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值