簡體   English   中英

Java:修改ArrayList時獲取並發修改異常

[英]Java: Getting Concurrent Modification Exception when modifying ArrayList

因此,我正在編寫一個程序來跟蹤各種文檔,例如電子郵件,備忘錄和報告。 默認情況下,文檔存儲在一個稱為“活動”的ArrayList中,但是用戶可以選擇使用標識碼(“ docId”)將它們傳輸到另一個稱為“存檔”的ArrayList中。

我以為這很簡單,但是我遇到了這個錯誤,感謝您為解決該錯誤提供的幫助。 這是我的代碼:

private static ArrayList active = new ArrayList();
private static ArrayList archive = new ArrayList(); 

public static void archiveDocument(double docId)
{       
    if(active.isEmpty() == true)
    {
        System.out.println(Messages.emptyList());
    }
    else
    {
        for(Object a : active)
        {
            Document doc = (Document) a;

            if(doc.getIdNum() == docId)
            {
                archive.add(a);
                active.remove(a);

                System.out.printf(Messages.enteredIntoArchive(), doc.getIdNum());
            }
            else System.out.println(Messages.notFound());
        }
    }
}

您正在嘗試遍歷其枚舉器時更改列表。

for(Object a : active)

這開始一個枚舉

active.remove(a);

您在這里修改它。

一種簡單的解決方法是先復制列表,然后再枚舉列表,然后再枚舉副本。

ArrayList activeCopy = new ArrayList(active);
for(Object a : activeCopy)
{
...
}

如果要在迭代過程中刪除,請使用顯式迭代器:

Iterator i = active.iterator();
while (i.hasNext()) {
  Document doc = (Document) i.next();
  if (doc.getIdNum() == docId) {
    archive.add(doc);
    i.remove();
    System.out.printf(Messages.enteredIntoArchive(), doc.getIdNum());
  }
  else
    System.out.println(Messages.notFound());
}

您無法在同時閱讀時修改枚舉。 您需要復制ArrayList 有時我通過將ArrayList轉換為array[]捷徑。

public void archiveDocument(double docId) {
        if (active.isEmpty() == true) {
            System.out.println(Messages.emptyList());
        } else {
            for (Object a : active.toArray(new Object[0])) {
                Document doc = (Document) a;

                if (doc.getIdNum() == docId) {
                    archive.add(a);
                    active.remove(a);

                    System.out.printf(Messages.enteredIntoArchive(), doc
                            .getIdNum());
                } else
                    System.out.println(Messages.notFound());
            }
        }
    }

暫無
暫無

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

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