java.lang.StackOverflowError递归异常

hello,我是小灰熊Carroll,下面这张图片不是本人,别误会噢,嘿嘿。

Alt

开始:首先上个—错误代码

//递归批量复制
    private List<BomCopyTarget> lxxCopy(BomCopy bomCopy,BomCopyTarget bomCopyTarget) {
        List<BomCopyTarget> copyTargetList=new ArrayList<>();
        if (!CollectionUtils.isEmpty( bomCopy.getChildren())) {
            for (BomCopy copyBom : bomCopy.getChildren()) {
                BomCopyTarget bomCopyTarget1=new BomCopyTarget();
                bomCopyTarget1.setId(bomCopyTarget.getId());
                bomCopyTarget1.setBomName(bomCopyTarget.getBomName());
                bomCopyTarget1.setVersion(bomCopyTarget.getVersion());
                bomCopyTarget1.setProcessId(copyBom.getProcessId());
                copyTargetList.add(bomCopyTarget1);
                List<BomCopyTarget> sonCopyTargets = lxxCopy(copyBom,bomCopyTarget);
                //下面为多余的错误代码
                bomCopyTarget.setChildren(sonCopyTargets);
                copyTargetList.add(bomCopyTarget);
            }
        }
        return copyTargetList;
    }
        @Override
    public List<BomCopyTarget> getLxxCopy(BomCopy bomCopy, BomCopyTarget bomCopyTarget) {
        return lxxCopy(bomCopy,bomCopyTarget);
    }

在Controller中打个“可爱的”断点

在这里插入图片描述

可以看到出现异常

在这里插入图片描述

展开返回数据的结构

在这里插入图片描述

每个报错的children里面的size()方法都是4个,并且都是重复的。这个无限循环导致了StackOverflowError异常,放开断点继续执行

**********************
BomCopyTarget(id=2, bomName=null, version=null, processId=2, children=null)
2021.01.06 at 23:32:07 CST ERROR com.wallcloth.exception.GlobalExceptionHandler exceptionHandler() @45 - Exception.url:http://localhost:8080/api//basic/biz/bom/bulkcopy ERROR:Handler dispatch failed; nested exception is java.lang.StackOverflowError Exception:java.lang.StackOverflowError 
2021.01.06 at 23:32:07 CST ERROR com.wallcloth.exception.GlobalExceptionHandler exceptionHandler() @46 - Exception
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.StackOverflowError
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055) [spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) [spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) [spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) [tomcat-embed-core-9.0.37.jar:4.0.FR]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) [spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	Caused by: java.lang.StackOverflowError
at java.lang.String.valueOf(String.java:2994) ~[?:1.8.0_181]
	at java.lang.StringBuilder.append(StringBuilder.java:131) ~[?:1.8.0_181]
	at com.wallcloth.model.biz.bom.entity.BomCopyTarget.toString(BomCopyTarget.java:13) ~[classes/:?]
		at java.util.AbstractCollection.toString(AbstractCollection.java:462) ~[?:1.8.0_181]
	at java.lang.String.valueOf(String.java:2994) ~[?:1.8.0_181]
	at java.lang.StringBuilder.append(StringBuilder.java:131) ~[?:1.8.0_181]
	at com.wallcloth.model.biz.bom.entity.BomCopyTarget.toString(BomCopyTarget.java:13) ~[classes/:?]
	at java.lang.String.valueOf(String.java:2994) ~[?:1.8.0_181]
	at java.lang.StringBuilder.append(StringBuilder.java:131) ~[?:1.8.0_181]
	at java.util.AbstractCollection.toString(AbstractCollection.java:462) ~[?:1.8.0_181]

正确代码

//递归批量复制
    private List<BomCopyTarget> lxxCopy(BomCopy bomCopy,BomCopyTarget bomCopyTarget) {
        List<BomCopyTarget> copyTargetList=new ArrayList<>();
        if (!CollectionUtils.isEmpty( bomCopy.getChildren())) {
            for (BomCopy copyBom : bomCopy.getChildren()) {
                BomCopyTarget bomCopyTarget1=new BomCopyTarget();
                bomCopyTarget1.setId(bomCopyTarget.getId());
                bomCopyTarget1.setBomName(bomCopyTarget.getBomName());
                bomCopyTarget1.setVersion(bomCopyTarget.getVersion());
                bomCopyTarget1.setProcessId(copyBom.getProcessId());
                copyTargetList.add(bomCopyTarget1);
                List<BomCopyTarget> sonCopyTargets = lxxCopy(copyBom,bomCopyTarget);
                bomCopyTarget1.setChildren(sonCopyTargets);
            }
        }
        return copyTargetList;
    }

再次执行

在这里插入图片描述
在这里插入图片描述

问题成功解决

总结:递归的无线循环导致-StackOverflowError(堆栈溢出错误)

在这里插入图片描述

代码中有些命名不规范,主要是为了表达一种“特立独行、放荡不羁”的美好精神。然而,在提交code的时候小熊Carroll还是认真的改好名称呢,哈………有机会,下次见。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值