编译时间检查或java.util.ConcurrentModificationException

时间:2013-02-25 22:22:12

标签: java loops concurrency concurrentmodification

下面的循环抛出ConcurrentModificationException。它是否应该给出编译器错误。运行时异常的原因是什么?

final List<String> list = new ArrayList<String>();
list.add("AAAAAAAAAAAAA");
for (final String it : list) {
    System.out.println(it);
    list.add("SSSSSSSSSS");
}

2 个答案:

答案 0 :(得分:7)

List的某些实现可能允许在通过add进行迭代时调用Iterator。例如,根据javadocCopyOnWriteArrayList不会抛出ConcurrentModificationException

为何选择RuntimeException?因为程序员的工作是知道正在使用的List的特定实现是否允许该行为。对于它的价值,有像FindBugs这样的静态代码分析器,可以警告你不要那样危险的模式。

答案 1 :(得分:1)

抛出异常是因为您在迭代时尝试修改列表。它可以避免迭代迭代器使用法线或者一段时间。