2013-02-25 66 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

拋出異常是因爲在迭代它時嘗試修改列表。可以避免使用正常或一段時間迭代其迭代器。