今日在调试程序时,出现了 java.util.ConcurrentModificationException,出错代码如下:
for
(Iterator ite
=
candidateObjDtoList.iterator(); ite.hasNext(); )
...
{
CandidateObjDto dto = (CandidateObjDto)ite.next();
if(dto.getType() == Constants.CANDIDATE_OBJ_TYPE_SET) ...{
dto.setVoteType(Constants.VOTE_TYPE_ABSTAIN);
} else ...{
candidateObjDtoList.remove(dto);
}
}
CandidateObjDto dto = (CandidateObjDto)ite.next();
if(dto.getType() == Constants.CANDIDATE_OBJ_TYPE_SET) ...{
dto.setVoteType(Constants.VOTE_TYPE_ABSTAIN);
} else ...{
candidateObjDtoList.remove(dto);
}
}
在网上搜索到资料如下:
在Map或者Collection的时候,不要用它们的API直接修改集合的内容,如果要修改可以用Iterator的remove()方法,例如:
public void setReparation( Reparation reparation ) ... {
for (Iterator it = this.reparations.iterator();it.hasNext();)...{ //reparations为Collection
Reparation repa = (Reparation)it.next();
if (repa.getId() == reparation.getId())...{
this.reparations.remove(repa);
this.reparations.add(reparation);
}
}
}
如上写会在运行期报ConcurrentModificationException,可以如下修改:
public void setReparation( Reparation reparation ) ... {
boolean flag = false;
for (Iterator it = this.reparations.iterator();it.hasNext();)...{ //reparations为Collection
Reparation repa = (Reparation)it.next();
if (repa.getId() == reparation.getId())...{
it.remove();
flag = true;
break;
}
}
if(flag)...{
this.reparations.add(reparation);
}
}
public void setReparation( Reparation reparation ) ... {
for (Iterator it = this.reparations.iterator();it.hasNext();)...{ //reparations为Collection
Reparation repa = (Reparation)it.next();
if (repa.getId() == reparation.getId())...{
this.reparations.remove(repa);
this.reparations.add(reparation);
}
}
}
如上写会在运行期报ConcurrentModificationException,可以如下修改:
public void setReparation( Reparation reparation ) ... {
boolean flag = false;
for (Iterator it = this.reparations.iterator();it.hasNext();)...{ //reparations为Collection
Reparation repa = (Reparation)it.next();
if (repa.getId() == reparation.getId())...{
it.remove();
flag = true;
break;
}
}
if(flag)...{
this.reparations.add(reparation);
}
}
成功解决了所遇问题,成功后的代码如下:
for
(Iterator ite
=
candidateObjDtoList.iterator(); ite.hasNext(); )
...
{
CandidateObjDto dto = (CandidateObjDto)ite.next();
if(dto.getType() == Constants.CANDIDATE_OBJ_TYPE_SET) ...{
dto.setVoteType(Constants.VOTE_TYPE_ABSTAIN);//对该候选项投弃权票
} else ...{
ite.remove();
}
}
CandidateObjDto dto = (CandidateObjDto)ite.next();
if(dto.getType() == Constants.CANDIDATE_OBJ_TYPE_SET) ...{
dto.setVoteType(Constants.VOTE_TYPE_ABSTAIN);//对该候选项投弃权票
} else ...{
ite.remove();
}
}