为什么不抛出ConcurrentModificationException

时间:2012-08-31 13:10:12

标签: java exception collections

当您使用Java 1.5现代循环迭代集合并删除一些元素时 抛出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 个答案:

答案 0 :(得分: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);
        }
    }
}