在迭代哈希集时Java中的StackOverflow异常

时间:2011-09-22 06:33:19

标签: iteration stack-overflow hashset

我正在尝试选择一些在hashset中保存的称为元素的对象。我正在使用类似

的foreach迭代称为元素的hashset
for( 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);
}

提前致谢

1 个答案:

答案 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();
}

}