[英]Concurrent Modification Exception When Modifying ArrayList of 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.