在排序树映射上迭代:java.util.ConcurrentModificationException

在排序树映射上迭代:java.util.ConcurrentModificationException,java,iterator,treemap,sortedset,Java,Iterator,Treemap,Sortedset,我有Java的基本知识,目前正在编写基于Java的代码 编辑:我没有写代码 我正在迭代事件对象的排序树状图,并在尝试获取下一个元素时获取此异常: java.util.ConcurrentModificationException 位于java.util.TreeMap$PrivateEntryIterator.nextEntry(未知源) 在java.util.TreeMap$KeyIterator.next(未知源代码) 我认为这应该是由于迭代器比较器合并了多个具有相同值的条目(请参考此项,但

我有Java的基本知识,目前正在编写基于Java的代码

编辑:我没有写代码

我正在迭代
事件
对象的排序树状图,并在尝试获取下一个元素时获取此异常:

java.util.ConcurrentModificationException
位于java.util.TreeMap$PrivateEntryIterator.nextEntry(未知源)
在java.util.TreeMap$KeyIterator.next(未知源代码)

我认为这应该是由于迭代器比较器合并了多个具有相同值的条目(请参考此项,但我不知道如何找到比较器中使用的键。对象
事件
有许多参数(如id、时间等),但不确定迭代器使用哪个参数

以下是相关的代码部分(第二个
SimEvent first=fit.next();
中的异常):

if(future.size()>0){
List toRemove=new ArrayList();
迭代器fit=future.Iterator();
队列_empty=false;
SimEvent first=fit.next();
processEvent(第一);
未来。移除(第一);
fit=future.iterator();
//检查下一个事件是否同时发生。。。
布尔trymore=fit.hasNext();
while(trymore){
SimEvent-next=fit.next();
if(next.eventTime()==first.eventTime()){
processEvent(下一个);
toRemove.add(下一步);
trymore=fit.hasNext();
}否则{
trymore=false;
}
}
future.removeAll(toRemove);
}否则{…}
编辑:
future
class的大厅代码:

公共类未来队列{
/**已排序的集合*/
专用最终分拣集分拣集=新树集();
/**连续剧*/
专用长序列=0;
/**
*向队列中添加新事件。向队列中添加新事件将保留事件的时间顺序
*队列中的事件。
* 
*@param newEvent要放入队列的事件。
*/
public void addEvent(SimEvent newEvent){
setSerial(serial++);
sortedSet.add(新事件);
}
/**
*将新事件添加到队列头。
* 
*@param newEvent要放入队列的事件。
*/
public void addEventFirst(SimEvent newEvent){
newEvent.setSerial(0);
sortedSet.add(新事件);
}
/**
*将迭代器返回到队列。
* 
*@返回迭代器
*/
公共迭代器迭代器(){
返回sortedSet.iterator();
}
/**
*返回此事件队列的大小。
* 
*@返回大小
*/
公共整数大小(){
返回sortedSet.size();
}
/**
*从队列中删除事件。
* 
*@param-event事件
*@return true,如果成功
*/
公共布尔删除(SimEvent事件){
返回分拣集。移除(事件);
}
/**
*从队列中删除所有事件。
* 
*@param events事件
*@return true,如果成功
*/
公共布尔removeAll(收集事件){
返回sortedSet.removeAll(事件);
}
公共空间清除(){
sortedSet.clear();
}
}
有关如何继续调试此问题的任何建议?

已编辑:这是一个常见错误。在使用
迭代器对集合进行迭代时,不能直接修改集合(添加或删除元素)。例如,必须通过
迭代器本身进行删除

正确的方法如下(不是一个完整的例子,只是为了说明这一点):

Iterator fit=future.Iterator();
while(fit.hasNext()){
SimEvent event=fit.next();
processEvent(事件);
安装。拆卸();
}

在迭代集合时,请注意可能添加到集合或从集合中删除的其他线程。

请共享
future
类的代码好吗?为什么有时使用fit.next()而不选中fit.hasNext()?@VasiliyVlasov:在问题edituser7294900中完成:我是这样得到这段代码的。在我得到异常之前,我已经检查了迭代器是否还有下一个元素。不清楚您得到的是java.util.ConcurrentModificationException(在问题中)还是java.util.NoSuchElementException(在标题中)。抱歉,我看不到集合的使用位置(仅在
FutureQueue
类的
removeAll
方法中)?问题是,在我向队列中添加其他类型的事件之前,此代码运行良好。您确定已发布实际代码吗?很抱歉,我正在查看java.util.TreeMap$PrivateEntryIterator.nextEntry的源代码,但看不到出现异常的任何其他原因。是否尝试在调试器中运行代码?是的。Act通常,我正在开发一个由其他人开发的模拟器,我正在使用
addEvent
方法将其他类型的事件添加到模拟器中的
future
其他位置。我在调试器中运行代码,我可以看到
fit
有下一个元素,但得到了错误。如果同时运行,可能会出现问题(在另一个线程中)在future.iterator()和fit.next()之间添加一个事件,因为addEvent()修改集合。这也可以解释为什么它有时有效,有时无效-这取决于方法调用的时间。我设法以不同的方式实现了我的事件:我避免了将它们直接添加到
future
类中。感谢您的宝贵意见!
Iterator<SimEvent> fit = future.iterator();
while (fit.hasNext()) {
    SimEvent event = fit.next();
    processEvent(event);
    fit.remove();
}