我正在阅读有关ConcurrentModificationException以及如何避免它的信息。找到了一篇文章。该文章中的第一个清单具有与以下相似的代码,这显然会导致异常:
List<String> myList = new ArrayList<String>(); myList.add("January"); myList.add("February"); myList.add("March"); Iterator<String> it = myList.iterator(); while(it.hasNext()) { String item = it.next(); if("February".equals(item)) { myList.remove(item); } } for (String item : myList) { System.out.println(item); }
然后,它继续以各种建议解释如何解决该问题。
当我尝试重现它时,我没有遇到异常! 为什么我没有得到例外?
根据JavaAPI文档,Iterator.hasNext不会抛出ConcurrentModificationException。
ConcurrentModificationException
检查后"January","February"您从列表中删除了一个元素。调用it.hasNext()不会抛出a,ConcurrentModificationException而是返回false。因此,您的代码干净地退出了。但是,永远不会检查最后一个字符串。如果添加"April"到列表中,则将按预期方式获得异常。
"January"
"February"
it.hasNext()
"April"
import java.util.List; import java.util.ArrayList; import java.util.Iterator; public class Main { public static void main(String args[]) { List<String> myList = new ArrayList<String>(); myList.add("January"); myList.add("February"); myList.add("March"); myList.add("April"); Iterator<String> it = myList.iterator(); while(it.hasNext()) { String item = it.next(); System.out.println("Checking: " + item); if("February".equals(item)) { myList.remove(item); } } for (String item : myList) { System.out.println(item); } } }
http://ideone.com/VKhHWN