gpt4 book ai didi

java - 第二次调用带有迭代器的方法会抛出 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-12-01 18:17:21 24 4
gpt4 key购买 nike

我尝试做的 - 在两个不同的列表上调用两次 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
...
}

调用此方法:

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

我不知道为什么。调试器告诉我,第二次时,pars.listIterator() 无法计算/抛出 ConcurrentModificationException。

我已经花了几个小时来解决这个问题。也许有人可以帮忙!

问候,

巴特

最佳答案

我解决了,问题不在这里。问题出在 enPars en nlPars 的构造上。它们的派生方式类似于 nlPars = pars.subList(...)。这很好,但它们是 pars 列表上的 View ,并且迭代器是相同的,因此出现了问题。

更改它解决了问题:

enPars = new ArrayList<P>(pars.subList(0, i));

关于java - 第二次调用带有迭代器的方法会抛出 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60343640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com