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