2012-08-31 144 views
1

當您使用Java 1.5 modern for循環集合並刪除某些元素 concurrentmodifuicationexception被拋出時。爲什麼不拋出ConcurrentModificationException

但是當我運行follwoing代碼,它不拋出任何異常:

public static void main(String a []){ 
      Set<String> strs = new HashSet<String>(); 
      strs.add("one"); 
      strs.add("two"); 
      strs.add("three); 

      for(String str : strs){ 
        if(str.equalsIgnoreCase("two"){ 
          strs.remove(str); 
        } 
      } 
    } 

上面的代碼不會拋出ConcurrentModificationException。但是當我在我的Web應用程序服務方法中使用任何這樣的循環時,它總是拋出一個。爲什麼?我確定當它運行在service方法中時,沒有兩個線程正在訪問集合那麼,在兩個場景中引發差異的原因是什麼引起了它在一個而不是另一個引發的情況?

+0

[給我一個(http://ideone.com/o73eW) – Eric

回答

7

運行您的代碼時(修復幾個拼寫錯誤之後),我得到ConcurrentModificationException

唯一的場景,你不會得到一個ConcurrentModificationException是:

  • 如果您刪除的項目不在設定,見下面的例子:
  • ,如果你刪除最後一個迭代的項(其中不一定在一個HashSet的情況下,最後添加的項目)
public static void main(String[] args) { 
    Set<String> strs = new HashSet<String>(); 
    strs.add("one"); 
    strs.add("two"); 
    strs.add("three"); 

    for (String str : strs) { 
     //note the typo: twos is NOT in the set 
     if (str.equalsIgnoreCase("twos")) { 
      strs.remove(str); 
     } 
    } 
} 
+4

+1如果你刪除了迭代的最後一個元素,你將不會得到CME。 –

+0

@PeterLawrey有趣 - 編輯。 – assylias

+0

這運行正常。 ;)設置 strs = new HashSet (); strs.add(「one」); (String str:strs){ strs.remove(str); } –

相關問題