java.util.Abstractlist中的Java ConcurrentModificationException

时间:2013-04-02 10:14:29

标签: java exception

我在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 个答案:

答案 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