我正在阅读关于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 docs
Iterator.hasNext不会引发ConcurrentModificationException.
检查“1月”和“2月”后,从列表中删除一个元素.调用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