Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用迭代器第二次调用方法会引发ConcurrentModificationException_Java_Iterator - Fatal编程技术网

Java 使用迭代器第二次调用方法会引发ConcurrentModificationException

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

我尝试做的是在两个不同的列表上调用两次a方法:

  • 如果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 List

nlPars//在构造函数中初始化 私有列表

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