1

Java 1.5の最新のforループを使用してコレクションを反復処理し、一部の要素を削除すると、concurrentmodifuicationexceptionがスローされます。

しかし、次のコードを実行しても、例外はスローされません。

    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アプリケーションサービスメソッドでそのようなforループを使用すると、常に1つスローされます。なんで?サービスメソッドで実行されているときにコレクションにアクセスしているスレッドが2つもないと確信しています。では、コレクションが一方にスローされ、もう一方にスローされない2つのシナリオで違いが生じる原因は何でしょうか。

4

1 に答える 1

8

コードを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);
        }
    }
}
于 2012-08-31T13:13:56.870 に答える