2013-02-25 98 views
2

下面的循环会引发ConcurrentModificationException。它是否应该给出编译器错误。运行时异常的原因是什么?编译时检查或java.util.ConcurrentModificationException

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

它为什么会抛出编译错误?您正在对已声明的对象实例进行有效的方法调用。确定呼叫的上下文有效性不是编译器的工作。 – Perception 2013-02-25 22:41:57

回答

7

List一些实施方案可允许呼叫向add而经由Iterator被迭代。例如,根据javadocCopyOnWriteArrayList不会抛出ConcurrentModificationException

为什么一个RuntimeException?因为程序员的工作是知道List被使用的具体实现是否允许这种行为。对于它的价值,有像FindBugs这样的静态代码分析器可以提醒你注意这种危险模式。

1

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