简体   繁体   English

无法找出ConcurrentModificationException的原因

[英]Can't figure out the reason for ConcurrentModificationException

The following method throws a ConcurrentModificationException : 以下方法引发ConcurrentModificationException

Method 1 (With exception): 方法1(例外):

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);
}

And when I changed the above method to this: 当我将上述方法更改为:

Method 2 (Without exception): 方法2(无例外):

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

    Calculation calculation = null;

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

    int size = l.size();

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

Then there's no exception! 那也不例外! Cannot figure out why? 不知道为什么?

Exception trace: 异常跟踪:

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

Complete Class: 完成课程:

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);
    }

}

Now when getListData is called exceptions occurs. 现在,调用getListData时会发生异常。

Since sort() methos jumble up whole collection , you have to call sort() method first. 由于sort()方法混杂了整个集合,因此您必须先调用sort()方法。 After that call iterator() . 之后,调用iterator()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM