有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么编译器没有发现ConcurrentModificationException的某些原因

很明显,这段代码在迭代过程中修改了一个列表

public class ArrayIterator {

    public static void main(String[] args) {

        List<String> list = new LinkedList<>(Arrays.asList("A","B","C","D","E"));

        Iterator<String> it = list.iterator();
        while (it.hasNext())
        {
            list.remove(it.next());
        }

    }
}

所以我们得到了预期的异常

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:966)
    at java.util.LinkedList$ListItr.next(LinkedList.java:888)
    at ArrayIterator.main(ArrayIterator.java:15)

为什么编译器不能对此发出警告


共 (3) 个答案

  1. # 1 楼答案

    编译器了解Java语言。它不知道构成Java标准库的数千个类中的任何一个类的API契约(除了java.lang包中的一些类)

  2. # 2 楼答案

    <>编译器不考虑代码的逻辑,只有合法的。

    例如:

    public void explode(int i) {
        System.out.println(1 / (i - i)); // always divide by zero
    }
    

    这将始终抛出一个ArithmeticException,但它编译得很好

    您的代码是一个不太明显的例子

  3. # 3 楼答案

    java.util.ConcurrentModificationException是运行时异常。它可能发生(也可能不发生)。在某些场景中,您可能希望remove()在对集合进行迭代时引发此异常,但根据元素的数量和当前元素的位置,不会发生异常

    例如,以下情况不会引发异常:

    List<String> list = new LinkedList<String>(Arrays.asList("A", "B", "C", "D", "E"));
    Iterator<String> it = list.iterator();
    while (it.hasNext()) {
        String next = it.next();
        if(next.equals("D")) {
            list.remove(next);
        }
    }
    

    另一方面,以下命令引发异常:

    List<String> list = new LinkedList<String>(Arrays.asList("A", "B", "C", "D", "E"));
    Iterator<String> it = list.iterator();
    while (it.hasNext()) {
        String next = it.next();
        if(next.equals("C")) {
            list.remove(next);
        }
    }