Java 使用迭代器第二次调用方法会引发ConcurrentModificationException
我尝试做的是在两个不同的列表上调用两次a方法:Java 使用迭代器第二次调用方法会引发ConcurrentModificationException,java,iterator,Java,Iterator,我尝试做的是在两个不同的列表上调用两次a方法: 如果isTranslation()为true,则必须删除元素P 如果isTitle()为true,则必须删除元素P和以下元素 我正在运行以下代码: private List<P> nlPars; //initialised in constructor private List<P> enPars; //initialised in constructor public void build(){ ... remo
- 如果isTranslation()为true,则必须删除元素P
- 如果isTitle()为true,则必须删除元素P和以下元素李>
private List<P> nlPars; //initialised in constructor
private List<P> enPars; //initialised in constructor
public void build(){
...
removeHeaders(nlPars); //first time calling, no problem
removeHeaders(enPars); //second time calling, throws ConcurrentModificationException
...
}
private ListnlPars//在构造函数中初始化
私有列表
enPars//在构造函数中初始化
公共void build(){
...
removeHeaders(NLPAR);//第一次调用,没有问题
removeHeaders(enPars);//第二次调用时,抛出ConcurrentModificationException
...
}
调用此方法:
@VisibleForTesting
void removeHeaders(final List<P> pars) {
pars.removeIf(p -> isTranslation(p));
for (final ListIterator<P> it = pars.listIterator(); it.hasNext(); ) {
if (isTitle(it.next())) {
it.remove();
if (it.hasNext()) {
it.next();
it.remove();
}
break;
}
}
}
@VisibleForTesting
作废删除标题(最终列表PAR){
去除部分(p->反翻译(p));
for(final ListIterator
it=pars.ListIterator();it.hasNext();){
if(isTitle(it.next()){
it.remove();
if(it.hasNext()){
it.next();
it.remove();
}
打破
}
}
}
我不知道为什么。调试器告诉我,第二次无法对pars.listIterator()求值/抛出ConcurrentModificationException
我已经找了好几个小时来解决这个问题。也许有人能帮忙
问候,
巴特我解决了,问题不在这里。问题在于enPars en nlPars的建设。它们的派生形式类似于
nlPars=pars.subList(…)
。这很好,但它们是PAR列表上的视图,迭代器是相同的,因此存在问题
改变它解决了这个问题:
enPars = new ArrayList<P>(pars.subList(0, i));
enPars=newarraylist(pars.subList(0,i));