java tostring null,龙目岛-java.lang.StackOverflowError:toString方法上为null

I have two classes Product and Categorie. When I would like to modify the list of products in categorie with categoryRepository.save(c1) as shown in the code below, this error occurs:

java.lang.StackOverflowError: null

at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:449) ~[na:1.8.0_191]

at java.lang.StringBuilder.append(StringBuilder.java:136) ~[na:1.8.0_191]

at org.sid.entities.Product.toString(Product.java:12) ~[classes/:na]

at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_191]

at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_191]

at java.util.AbstractCollection.toString(AbstractCollection.java:462) ~[na:1.8.0_191]

at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_191]

at java.lang.StringBuilder.append(StringBuilder.java:131) ~[na:1.8.0_191]

at org.sid.entities.Categorie.toString(Categorie.java:15) ~[classes/:na]

at java.lang.String.valueOf(String.java:2994) ~[na:1.8.0_191]

@Document

@Data @AllArgsConstructor @NoArgsConstructor @ToString

public class Categorie {

@Id

private String id;

private String name;

@DBRef

@JsonIgnore

private Collection products=new ArrayList<>();

@Document

@Data @AllArgsConstructor @NoArgsConstructor @ToString

public class Product {

@Id

private String id;

private String name;

private double price;

@DBRef

private Categorie categorie;

@Bean

CommandLineRunner start(CategoryRepository categoryRepository, ProductRepository productRepository){

return args -> {

categoryRepository.deleteAll();

Stream.of("c1 Ordinateur","c2 Imprimente").forEach(c->{

categoryRepository.save(new Categorie(c.split(" ")[0],c.split(" ")[1],new ArrayList<>()));

});

categoryRepository.findAll().forEach(System.out::println);

productRepository.deleteAll();

Categorie c1=categoryRepository.findById("c1").get();

Stream.of("P1","P2","P3","P4").forEach(name->{

Product p= productRepository.save(new Product(null,name,Math.random()*1000,c1));

c1.getProducts().add(p);

categoryRepository.save(c1);

});

productRepository.findAll().forEach(p->{

System.out.println(p.toString());

});

};

}

Can anyone have an idea to solve this issue? Thanks.

解决方案

You are having a circular reference in the toString method generated by Lombok.

Product is referencing Categorie on toString, which is referencing Product, and so on

You could use the exclude a property @ToString, but it is going to be deprecated soon, so use the @ToString.Exclude:

@Document

@Data @AllArgsConstructor @NoArgsConstructor @ToString

public class Product {

...

@ToString.Exclude

private Categorie categorie;

...

}

@Document

@Data @AllArgsConstructor @NoArgsConstructor @ToString

public class Categorie {

...

@ToString.Exclude

private Collection products=new ArrayList<>();

...

}

Lombok refs here and here

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java.lang.StackOverflowError是由于栈溢出引起的错误,通常是由于无限递归或死循环引起的。解决方法如下: 1.检查代码中是否存在无限递归或死循环,特别是在多个实体类之间有多对一、多对多关系时,重写toString方法的时候一定要注意,不要两个有对应关系的实体类都重写相关联属性字段的toString方法,这样会导致一直递归重写下去,内存当然会被耗尽,导致栈溢出。 2.增加栈大小,可以通过-Xss参数来增加栈大小,但是这种方法并不是根本解决问题的方法,只是暂时解决问题。 3.优化代码,减少递归深度或循环次数,可以通过迭代代替递归,或者使用尾递归等方式来优化代码。 4.使用数据结构来代替递归,例如使用栈或队列等数据结构来实现递归算法。 <<引用:我的错误原因是原因1,我首先是增加的-Xss参数,后来发现还是报错,后来仔细检查,才知道是产生了死循环,所以,大家一定要检查仔细了 复现 public class StackOverflowErrorExample { public static void main(String args[]) { a(); } public static void a() { a(); } } 。 引用:原因1:递归导致,死循环或者无限循环调用,多个实体类之间有多对一、多对多 关系时,重写toString方法的时候一定要注意,不要两个有对应关系的实体类都重写相关联属性字段的toString方法,这样会导致一直递归重写下去,内存当然会被耗尽,导致栈溢出 造成我查你你查我,循环往复,就形成了递归,进而引起stackoverflow。细致的检查报错信息,找出行号的重复模式。这些重复的行号代表了被递归调用的代码。仔细审查代码,理解为何递归不终止。>>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值