今日在調試程序時,出現了 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);
}
}
在網上搜索到資料如下:
在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);
}
}
成功解決了所遇問題,成功后的代碼如下:
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();
}
}
























































