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

Java 奇怪的是,没有并发修改例外。为什么?,java,Java,我知道,当我们尝试在列表上执行添加/删除时,数组列表会产生并发修改异常,同时对列表进行迭代 例如,当我尝试在迭代时删除一个项时,下面的方法应该抛出并发修改异常 public static void testMe() { inputList = new ArrayList<String>(); inputList.add("1"); inputList.add("2"); inputList.add("3"); // Try comment the

我知道,当我们尝试在列表上执行添加/删除时,数组列表会产生并发修改异常,同时对列表进行迭代

例如,当我尝试在迭代时删除一个项时,下面的方法应该抛出并发修改异常

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循环插入项,则会引发异常。我想知道为什么没有更早出现这种情况?

我在写我的原始接受答案时误读了这个问题,但无法删除它,因为它已被接受,所以我将编辑它,在这里总结另一个接受的答案:

一般来说,ConcurrentModificationException是在检测到修改而不是导致修改时抛出的

因此,由于ConcurrentModificationException是在对next的调用检测到已进行修改时引发的,因此此场景勉强避免了此类异常

因此,正如提问者自己在评论中指出的那样:

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


很抱歉这确实是一个重复的问题。。在写这个问题时,我应该超越堆栈溢出的建议。除了@ekuusela答案之外,我的同事在我的例子中清楚地解释了这个问题。通常,并发修改只会在调用next时被捕获。在我的示例中,列表有3个项,在第二次迭代中,一个项被删除,然后hasNext将返回false,该值将退出while循环next未被调用。如果列表有4个元素,并且如果您尝试在第二次迭代中删除一个元素,那么您将得到并发修改。