2011-09-22 48 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(); 
} 

}