2011-09-22 82 views
0

我试图选择一些名为保存在哈希集中的元素。我在HashSet的迭代用foreach称为元素,如通过哈希集迭代Java中的StackOverflow异常

for(Element e: elements). 

这些被选中的单元在ArrayList<Element> el处理。

其实我前一阵子没有任何问题。该方法从单元测试中传递。然后,突然间,我开始为该方法获得stackoverflow例外。我调试了。我看到一些奇怪的事情发生在那里。

我正在填充一个ArrayList并且元素的迭代完成。最后,该方法必须返回数组列表。但是,它开始通过将arraylist设置为空来重新设置哈希集。我不明白为什么会发生这种情况。我已经编程了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

我面对android系统中的任何建议同样的问题来解决问题? –

回答

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

}