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

use*_*259 2 java iterator javac

很明显,这段代码在迭代期间修改了一个列表.

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());
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

所以我们得到了预期的例外

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)
Run Code Online (Sandbox Code Playgroud)

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

man*_*uti 7

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)