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)
为什么编译器不能对此发出警告
# 1 楼答案
编译器了解Java语言。它不知道构成Java标准库的数千个类中的任何一个类的API契约(除了
java.lang
包中的一些类)# 2 楼答案
例如:
这将始终抛出一个
ArithmeticException
,但它编译得很好您的代码是一个不太明显的例子
# 3 楼答案
java.util.ConcurrentModificationException
是运行时异常。它可能发生(也可能不发生)。在某些场景中,您可能希望remove()
在对集合进行迭代时引发此异常,但根据元素的数量和当前元素的位置,不会发生异常例如,以下情况不会引发异常:
另一方面,以下命令引发异常: