我在Servlet类中有以下代码,我正在
ConcurrentModificationException checkforcomodification at java.util.Abstractlist
在for (Projects persist: projectList) {
如何解决此问题以及导致此异常的原因
代码段
List<Projects> projectList = new ArrayList<Projects>();
Projects project = new Projects();
projectList.add(project);
for (Projects persist: projectList) { // error in this line
persist.setPNo(pNo);
persist.setExpirtyDate(eDate;
myDAO.persistProjects(projectList);
projectList.clear();
}
答案 0 :(得分:3)
问题是您正在清除循环projectList.clear();
内的列表。
for循环中的最后一行是抛出错误而不是第一行。
你可以做的就是在处理循环后清除列表
List<Projects> projectList = new ArrayList<Projects>();
Projects project = new Projects();
projectList.add(project);
for (Projects persist: projectList) { // error in this line
persist.setPNo(pNo);
persist.setExpirtyDate(eDate);
}
myDAO.persistProjects(projectList);
projectList.clear();
答案 1 :(得分:3)
你真的需要
myDAO.persistProjects(projectList);
projectList.clear();
进入循环? 迭代时无法修改列表。 进行修改然后在循环清除和/或保持列表
之后您的代码可能必须是:
List<Projects> projectList = new ArrayList<Projects>();
Projects project = new Projects();
projectList.add(project);
for (Projects persist: projectList) {
persist.setPNo(pNo);
persist.setExpirtyDate(eDate;
}
myDAO.persistProjects(projectList);
除非您将列表重新用于其他用途,否则不应该需要 projectList.clear();
,但如果需要,请始终将其用于循环之外。
经验法则永远不会修改你正在迭代的列表,你可以用迭代器规避它,但通常不需要它并添加了很多样板代码,如果你需要删除一些对象,通常最好创建另一个包含要删除的元素的列表,只是在循环后删除整个列表,它更具可读性并避免任何问题。
答案 2 :(得分:1)
将projectList.clear();
移到 for
循环之外。
查看ConcurrentModificationException的API详细信息,详细了解这是一个问题。
如果一个线程在迭代时直接修改了一个集合 使用失败快速迭代器的集合,迭代器将会发生这种情况 异常。
答案 3 :(得分:1)
如果通过另一个itarator或另一个线程修改了list的结构,那么迭代将会抛出ConcurrentModificationException
。
在迭代List
时删除所有元素,以确保迭代器的快速行为,并在修改列表结构时抛出ConcurrentModificationException
。