2

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

4 回答 4

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();
于 2013-04-02T10:20:41.080 回答
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();除非您将列表重用于其他目的,否则应该不需要,但如果需要,请始终在循环之外使用它。

经验法则是永远不要修改您正在迭代的列表,您可以使用迭代器来规避它,但通常不需要它并添加大量样板代码,如果您需要删除一些对象,通常最好创建另一个列表要删除的元素并在循环后删除整个列表,它更具可读性并避免任何问题。

于 2013-04-02T10:21:29.323 回答
1

移出循环projectList.clear();for

查看ConcurrentModificationException的 API 详细信息,了解为什么这是一个问题的更多详细信息。

如果线程在使用快速失败迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。

于 2013-04-02T10:26:08.800 回答
1

如果 list 的结构通过另一个迭代器或另一个线程修改,则在迭代时,它将抛出ConcurrentModificationException.

您在迭代时删除了所有元素,List这确保了迭代器的快速失败行为,并ConcurrentModificationException随着列表结构的修改而抛出。

于 2013-04-02T10:26:44.930 回答