如何避免遍历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;

}
该如何改???大虾们,求救

解决方案 »

  1.   

    遍历hashmap的时候不允许做修改操作。
    换ConcurrentHashMap试试
      

  2.   

    我想知道你为什么要调用mailMap.clear()?还有,如果你只是想删除当前的roleId,那么只需要调用itor.remove()就可以做到。把mailMap.clear();mailMap.remove(roleId);
    注释掉
      

  3.   

    API中的说明:
    在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器本身的 remove 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。