我正在尝试选择一些在hashset中保存的称为元素的对象。我正在使用类似
的foreach迭代称为元素的hashsetfor( Element e: elements).
这些选定的元素在ArrayList<Element> el
中处理。
实际上,我前一段时间没有任何问题。该方法从单元测试中传递出来。然后,我突然开始为该方法获得stackoverflow异常。我调试了。我看到那里发生了一些奇怪的事情。
我正在填充一个arraylist并完成元素的迭代。最后,该方法必须返回arraylist。但是,它开始通过将arraylist设置为空来重新迭代hashset。我不明白为什么会这样。我已经编程了2年,这是我第一次看到这个奇怪的事情。
如果您想查看以下代码:
public ArrayList<Element> addNextLeftElements(Element firstEl, HashSet<Element> elements, ArrayList<Element> el) {
for (Element nextEl : elements) {
if (!nextEl.equals(firstEl)) {
if (nextEl.overlaps(firstEl, ac.absPrecision)) {
el.add(nextEl);
} else {
for (double dis = 16.0; dis <= 18.1; dis += 0.1) {
if (nextEl.transOverlap(firstEl, dis, ac.absPrecision)) {
if (!el.contains(firstEl)) {
el.add(firstEl);
}
}
for (int displus = 9; displus <= 11; displus++) {
if (nextEl.transOverlap(firstEl, dis, ac.absPrecision)) {
if (!el.contains(firstEl)) {
el.add(firstEl);
}
}
}
}
}
}
}
return(el);
}
提前致谢
答案 0 :(得分:0)
这个功能原样,很好。
java中的StackOverFlow异常几乎总是由无限循环触发,因此查看您调用的其中一个函数是否重新调用addNextLeftElements。运行这样的函数,只需查看堆栈,以便了解导致溢出的函数。
public ArrayList<Element> addNextLeftElements(Element firstEl, HashSet<Element> elements, ArrayList<Element> el) {
try{
for (Element nextEl : elements) {
if (!nextEl.equals(firstEl)) {
if (nextEl.overlaps(firstEl, ac.absPrecision)) {
el.add(nextEl);
} else {
for (double dis = 16.0; dis <= 18.1; dis += 0.1) {
if (nextEl.transOverlap(firstEl, dis, ac.absPrecision)) {
if (!el.contains(firstEl)) {
el.add(firstEl);
}
}
for (int displus = 9; displus <= 11; displus++) {
if (nextEl.transOverlap(firstEl, dis, ac.absPrecision)) {
if (!el.contains(firstEl)) {
el.add(firstEl);
}
}
}
}
}
}
}
return(el);
}catch (Exception e){
e.printStackTrace();
}
}