下面的循环抛出ConcurrentModificationException
. 它是否应该给出编译器错误。运行时异常的原因是什么?
final List<String> list = new ArrayList<String>();
list.add("AAAAAAAAAAAAA");
for (final String it : list) {
System.out.println(it);
list.add("SSSSSSSSSS");
}
下面的循环抛出ConcurrentModificationException
. 它是否应该给出编译器错误。运行时异常的原因是什么?
final List<String> list = new ArrayList<String>();
list.add("AAAAAAAAAAAAA");
for (final String it : list) {
System.out.println(it);
list.add("SSSSSSSSSS");
}
的一些实现List
可能允许在add
通过Iterator
. 例如,CopyOnWriteArrayList
不会ConcurrentModificationException
根据javadoc抛出 a 。
为什么一个RuntimeException
?因为程序员的工作是知道List
所使用的特定实现是否允许这种行为。值得一提的是,有像 FindBugs 这样的静态代码分析器,它可以警告您注意这样的危险模式。
抛出异常是因为您在迭代列表时尝试修改列表。它可以避免用正常的迭代器迭代它的迭代器或一段时间。