java.lang.StackOverflowError递归异常
- hello,我是小灰熊Carroll,下面这张图片不是本人,别误会噢,嘿嘿。
- 开始:首先上个—错误代码
- 在Controller中打个“可爱的”断点
- 可以看到出现异常
- 展开返回数据的结构
- 每个报错的children里面的size()方法都是4个,并且都是重复的。这个无限循环导致了*StackOverflowError异常*,放开断点继续执行
- 正确代码
- 再次执行
- 问题成功解决
- 总结:递归的无线循环导致-StackOverflowError(堆栈溢出错误)
- 代码中有些命名不规范,主要是为了表达一种“特立独行、放荡不羁”的美好精神。然而,在提交code的时候小熊Carroll还是认真的改好名称呢,哈………有机会,下次见。
hello,我是小灰熊Carroll,下面这张图片不是本人,别误会噢,嘿嘿。
开始:首先上个—错误代码
//递归批量复制
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;
}
再次执行