遍历hashMap出现java.util.concurrentmodificationexception异常

骑猪去东莞 2010-04-14 04:28:12
如何避免遍历hashMap出现java.util.concurrentmodificationexception异常,代码如下
public static boolean sendFlowersMail(){
HashMap<Integer,List<String>> mailMap = UserRoleManager.getMsgMap();

System.out.println("mailMap:"+mailMap.size());
StringBuffer sb = new StringBuffer();
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
List<String> list3 = new ArrayList<String>();
List<String> list4 = new ArrayList<String>();
for(Iterator itor = mailMap.keySet().iterator();itor.hasNext();){
int roleId = Integer.valueOf(itor.next().toString());
System.out.println("roleID:"+roleId);
List<String> list = (List<String>) mailMap.get(roleId);
for(String s:list){
String [] ss = s.split("\\,");
System.out.println("sss:"+s);
if(ss[0] !=null && !ss[0].equals("")){
if(Integer.valueOf(ss[1]) ==1){
if(Integer.valueOf(ss[3]) ==0){
list1.add(ss[0]+" "+ss[2]+"朵,");
}else{
list2.add("匿名 "+ss[2]+"朵,");
}
}else{
if(Integer.valueOf(ss[3]) ==0){
list3.add(ss[0]+" "+ss[2]+"个,");
}else{
list4.add("匿名 "+ss[2]+"个,");
}

}
}

}
sb.append("尊敬的天域玩家,你好,天域有你更美丽!你今天");
if((list1.size() >0 ||list2.size() >0) && (list3.size() > 0|| list4.size() > 0)){
sb.append("收到的鲜花:");
UserRoleManager.setStringBuffer(sb, list1);
UserRoleManager.setStringBuffer(sb, list2);
sb.append(";被扔的鸡蛋:");
UserRoleManager.setStringBuffer(sb,list3);
UserRoleManager.setStringBuffer(sb,list4);
}else if(!(list1.size() >0 ||list2.size() >0)&& (list3.size() > 0|| list4.size() > 0)){
sb.append("收到的被扔的鸡蛋:");
UserRoleManager.setStringBuffer(sb,list3);
UserRoleManager.setStringBuffer(sb,list4);
}else if((list1.size() >0 ||list2.size() >0) &&!(list3.size() > 0|| list4.size() > 0)){
sb.append("收到的鲜花:");
UserRoleManager.setStringBuffer(sb, list1);
UserRoleManager.setStringBuffer(sb, list2);
}
if(sb.length()>0){
Mail mail = new Mail();
String content = null;
for(int i=0;i<=sb.length()/100;i++){
if(sb.length() <=100*(i+1)){
content = sb.substring(100*i,sb.length());
}else {
content = sb.substring(100*i,100*(i+1));
}
mail.setContent(content);
mail.setTo(roleId);
System.out.println("----------------");
OLKManager.sendSysMail(roleId, mail);
}
}
mailMap.clear();
itor.remove();
mailMap.remove(roleId);
}
return true;

}

该如何改???大虾们,求救
...全文
344 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanxd39 2010-04-14
  • 打赏
  • 举报
回复
http://lengue.javaeye.com/blog/168149
tanxd39 2010-04-14
  • 打赏
  • 举报
回复
同步?
James.Ji 2010-04-14
  • 打赏
  • 举报
回复
API中的说明:
在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器本身的 remove 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。
kingsword588 2010-04-14
  • 打赏
  • 举报
回复
顶楼上的
James.Ji 2010-04-14
  • 打赏
  • 举报
回复
我想知道你为什么要调用mailMap.clear()?还有,如果你只是想删除当前的roleId,那么只需要调用itor.remove()就可以做到。把mailMap.clear();mailMap.remove(roleId);
注释掉

Kanepan 2010-04-14
  • 打赏
  • 举报
回复
遍历hashmap的时候不允许做修改操作。
换ConcurrentHashMap试试

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧