所以我正在编写一个程序来跟踪各种文档,如电子邮件,备忘录和报告。默认情况下,文档存储在名为“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());
}
}
}
答案 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());
}
}
}