奇怪的是没有并发修改例外。为什么?

时间:2015-05-03 19:37:44

标签: java

我理解当我们尝试在列表上执行(添加/删除)同时迭代列表时,数组列表会产生并发修改异常。

例如,当我尝试删除项目时,以下方法应该抛出并发修改异常。

public static void testMe() {
    inputList = new ArrayList<String>();
    inputList.add("1");
    inputList.add("2");
    inputList.add("3");

 // Try comment the above insertion and uncomment this and run
 // for (int i = 0; i < 5; i++) {
 //     inputList.add(""+i);
 // }

    System.out.println("List Size:" + inputList.size());
    Iterator<String> iterator = inputList.iterator();
    while (iterator.hasNext()) {
        String value = (String) iterator.next();
        if (value.equals("2")) {
            inputList.remove(value);
            System.out.println("remvoing 2");
        }
    }
    System.out.println("List Size:" + inputList.size());
}
奇怪的是,我没有得到一个。 但是如果我使用for循环插入项目,则抛出异常。我想知道为什么这不会更早发生?

1 个答案:

答案 0 :(得分:0)

当我写下我原来接受的答案时,我误解了这个问题,但由于它已被接受而无法删除,因此我将对此进行编辑以总结另一个接受的答案:https://stackoverflow.com/a/29723542/1630906

  

作为一般规则,在检测到修改时抛出ConcurrentModificationExceptions,而不是引起修改。

     

因此,当对next()的调用检测到已经进行了修改时抛出了ConcurrentModificationExceptions,这种情况可以避免这种异常。

就像提问者自己在评论中指出的那样:

  

如果列表有4个元素,如果你试图在第二次迭代中删除一个元素,那么你将得到并发修改。