Java:修改ArrayList时获取并发修改异常

时间:2011-11-29 00:49:33

标签: java

所以我正在编写一个程序来跟踪各种文档,如电子邮件,备忘录和报告。默认情况下,文档存储在名为“active”的ArrayList中,但用户可以选择使用标识代码(“docId”)将它们传输到名为“archive”的另一个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());
        }
    }
}

3 个答案:

答案 0 :(得分:3)

您正在尝试在迭代其枚举器时更改列表。

for(Object a : active)

这会启动枚举

active.remove(a);

你可以在这里修改它。

一个简单的解决方法是在枚举之前复制列表,然后枚举副本。

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

答案 1 :(得分:3)

如果要在迭代期间删除,请使用显式迭代器:

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

答案 2 :(得分:2)

您无法在同时阅读时修改枚举。您需要复制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());
            }
        }
    }