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