记一次开发中的栈溢出错误

昨天调试一段代码,代码的大概意思是有一个对象A,A中有一个属性list,需要将查询到结果(包括A) 放到list中,然后返回给前台,

debug的时候一路畅通,但是return结果集的时候报错栈溢出

先看下问题代码:

                List<WechatCirculation> tmpResultList = new ArrayList<>(list.size());
                list.forEach(tmp ->{
                    if(CollUtil.isNotEmpty(tmp)){
                        WechatCirculation wechatCirculation = tmp.get(0);
                        wechatCirculation.setCount(tmp.size());
                        tmpResultList.add(wechatCirculation);
                    }
                });

                LogFactory.get().info("tmpResultList==>",tmpResultList);

                //二审退回
                if(circulationType == 3 && Objects.equals("2",dict.getAttrVal())){

                    tmpResultList.forEach(tmp ->{

                        //这里直接将原来的对象查出来的对象放入list属性中 list中对象的内存地址和最外层对象的内存地址是一致的转为json的时候回造成死循环--->栈溢出
                        List<WechatCirculation> wechatCirculations
                                = wechatCirculationList.stream().filter(s->s.getTakerOrgId().equals(tmp.getTakerOrgId())).collect(Collectors.toList());

                          tmp.setList(wechatCirculations);
                    });

                }

出现问题就是在这里  因为tmp对象的属性list中的集合对象里包含 tmp对象

放入集合中的时候是没有问题的,但是序列化时 就会造成循环引用 最终导致栈溢出

改进后的代码:

 

        List<WechatCirculation> tmpResultList = new ArrayList<>(list.size());
                list.forEach(tmp ->{
                    if(CollUtil.isNotEmpty(tmp)){
                        WechatCirculation wechatCirculation = tmp.get(0);
                        wechatCirculation.setCount(tmp.size());
                        tmpResultList.add(wechatCirculation);
                    }
                });

                LogFactory.get().info("tmpResultList==>",tmpResultList);

                //二审退回
                if(circulationType == 3 && Objects.equals("2",dict.getAttrVal())){

                    tmpResultList.forEach(tmp ->{

                        //这里直接将原来的对象查出来的对象放入list属性中 list中对象的内存地址和最外层对象的内存地址是一致的转为json的时候回造成死循环--->栈溢出
                        List<WechatCirculation> wechatCirculations
                                = wechatCirculationList.stream().filter(s->s.getTakerOrgId().equals(tmp.getTakerOrgId())).collect(Collectors.toList());

                        List<WechatCirculation> newWechatCirculations=new ArrayList<>();
                        //更改对象的内存地址
                        for (WechatCirculation wechatCirculation:wechatCirculations){
                            WechatCirculation newWechatCirculation=new WechatCirculation();
                            BeanUtil.copyProperties(wechatCirculation,newWechatCirculation);
                            newWechatCirculations.add(newWechatCirculation);
                        }
                        tmp.setList(newWechatCirculations);
                          
                    });

                }

对象重新赋值  并进行值拷贝 最终不报错

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值