一尘不染

为什么这段代码没有引起ConcurrentModificationException?

java

我正在阅读有关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);
}

然后,它继续以各种建议解释如何解决该问题。

当我尝试重现它时,我没有遇到异常! 为什么我没有得到例外?


阅读 195

收藏
2020-09-08

共1个答案

一尘不染

根据JavaAPI文档,Iterator.hasNext不会抛出ConcurrentModificationException

检查后"January""February"您从列表中删除了一个元素。调用it.hasNext()不会抛出a,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

2020-09-08