我正在阅读有关 ConcurrentModificationException 以及如何避免它的信息。找到an article .该文章中的第一个列表具有类似于以下的代码,这显然会导致异常:
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);
}
然后它继续解释如何用各种建议解决问题。
当我尝试重现它时,我没有得到异常! 为什么我没有得到异常?
根据 Java API 文档 Iterator.hasNext不会抛出 ConcurrentModificationException
。
选中“January”
和“February”
后,您从列表中删除了一个元素。调用 it.hasNext()
不会抛出 ConcurrentModificationException
但会返回 false。因此您的代码干净地退出。然而,最后一个字符串永远不会被检查。如果您将 "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