簡體   English   中英

第二次調用帶有迭代器的方法拋出 ConcurrentModificationException

[英]Second calling of an method with iterator throws ConcurrentModificationException

我嘗試做的 - 在兩個不同的 List 上調用兩次 a 方法

  • 如果 isTranslation() 為真,則必須刪除元素 P。
  • 如果 isTitle() 為真,則必須刪除元素 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(...) 這很好,但它們是解析列表上的視圖,迭代器是相同的,因此存在問題。

改變它解決了這個問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM