Java Can';我不明白ConcurrentModificationException的原因

Java Can';我不明白ConcurrentModificationException的原因,java,exception,Java,Exception,以下方法抛出一个ConcurrentModificationException: 方法1(例外): 当我将上述方法改为: 方法2(无例外): 那也不例外!不知道为什么 异常跟踪: Exception: java.util.ConcurrentModificationException java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source)

以下方法抛出一个
ConcurrentModificationException

方法1(例外):

当我将上述方法改为:

方法2(无例外):

那也不例外!不知道为什么

异常跟踪:

Exception: java.util.ConcurrentModificationException java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
全班:

public class MyData 
{
    private Map <Integer, Calculation> statements = new HashMap<Integer, Calculation>();

    public List getListData()
    {
        List listData = this.getData(5);

        return listData;
    }

    public List getData(int n)
    {
        List l = new ArrayList(statement.values());
        Iterator i = l.iterator();

        Calculation calculation = null;

        while (i.hasNext())
        {
            calculation = (Calculation)i.next();
            if (!calculation.total.hasScores())
                i.remove();
        }

        Collections.sort(l);
        int size = l.size();

        return l.subList(0,size > n? n : size);
    }

}
公共类MyData
{
私有映射语句=new HashMap();
公共列表getListData()
{
List listData=this.getData(5);
返回列表数据;
}
公共列表getData(int n)
{
列表l=新的ArrayList(statement.values());
迭代器i=l.迭代器();
计算=空;
while(i.hasNext())
{
计算=(计算)i.下一步();
如果(!calculation.total.hasScores())
i、 删除();
}
集合。排序(l);
int size=l.size();
返回l.子列表(0,大小>n?n:大小);
}
}

现在调用getListData时会出现异常。

因为
sort()
method会把整个集合搞得一团糟,所以必须先调用
sort()
方法。在那次调用之后,
iterator()

你能添加异常跟踪和它导致异常的那一行吗?用异常跟踪更新它:)也许
i.remove()
在数组排序时永远不会被调用。请发布整个类,第一个还是第二个创建异常?
sort()
仅在迭代完成后调用。排序后未访问迭代器时,它应该如何触发CME?如果您在该集合中进行任何修改,迭代器将无效,除非您通过迭代器本身进行修改。java中几乎所有的集合都是“fail fast”,如果集合发生更改,它将抛出CME。我知道,但在OP声称抛出异常的第一个版本中,在调用
sort
之后,不会使用迭代器。如果你想说第二个版本有这个问题,你应该说出来。(或者理想情况下,要求OP澄清而不是回答。毕竟他们声称第二个版本有效)
Exception: java.util.ConcurrentModificationException java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
public class MyData 
{
    private Map <Integer, Calculation> statements = new HashMap<Integer, Calculation>();

    public List getListData()
    {
        List listData = this.getData(5);

        return listData;
    }

    public List getData(int n)
    {
        List l = new ArrayList(statement.values());
        Iterator i = l.iterator();

        Calculation calculation = null;

        while (i.hasNext())
        {
            calculation = (Calculation)i.next();
            if (!calculation.total.hasScores())
                i.remove();
        }

        Collections.sort(l);
        int size = l.size();

        return l.subList(0,size > n? n : size);
    }

}