[英]Why iterating list gives me stackoverflow error?
I am getting Stackoverflow whenever below code is ran. 每当运行以下代码时,我都会得到Stackoverflow。 I am not able to understand why this is happening? 我不明白为什么会这样? And how we can fix it? 以及我们如何解决它?
public boolean compare(List<Task> source, List<Task> actual) {
return compareTasks(source, actual) && compare(actual, source);
}
public boolean compareTasks(List<Task> source, List<Task> actual) {
matchList = new ArrayList<Task>();
differList = new ArrayList<Task>();
for (Task task : actual) {
if (source.contains(task)) {
matchList.add(task);
} else {
differList.add(task);
}
}
return (differList.size() == 0) ? true : false;
}
Below is the error: 下面是错误:
java.lang.StackOverflowError
at java.lang.StringBuilder.append(StringBuilder.java:119)
at com.user.test.Task.getKey(Task.java:209)
at com.user.test.Task.equals(Task.java:220)
at java.util.ArrayList.indexOf(ArrayList.java:216)
at java.util.ArrayList.contains(ArrayList.java:199)
at java.util.Collections$UnmodifiableCollection.contains(Collections.java:1000)
I believe the issue is in here: 我相信问题出在这里:
public boolean compare(List<Task> source, List<Task> actual) {
return compareTasks(source, actual) && compare(actual, source);
}
Imagine you want to compare list A to list B. If you'll notice: 假设您想将列表A与列表B进行比较。如果您发现:
This recursion never terminates, so it eventually triggers a stack overflow. 此递归永远不会终止,因此最终会触发堆栈溢出。
To fix this issue, consider rewriting this as 要解决此问题,请考虑将其重写为
public boolean compare(List<Task> source, List<Task> actual) {
return compareTasks(source, actual) && compareTasks(actual, source); // call compareTasks, not compare.
}
You are calling compareTasks again in the method. 您在方法中再次调用compareTasks。 Change it to the following line: return compareTasksList(source, actual) && compareTasksList(actual, source);
将其更改为以下行: return compareTasksList(source, actual) && compareTasksList(actual, source);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.