第一次遇到此异常是在处理3g.renren.com的好友分组功能中,因为接口提供的好友分组(以map的方式提供好友分组的id跟分组名)中没有把分组名为空,但是id存在的数据屏蔽掉,所以我在调用接口服务之后,需要重新处理value为空的数据。
代码如下:
view plain
import java.util.HashMap;
import java.util.Map;
/**
*
* Dec 1, 2011
* @author 车前猛跑
*/
public class MapDemo {
public static void main (String [] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(5, null); //①
//map.put(1, "a"); //②
//map.put(3, null); //③
MapDemo md = new MapDemo();
md.clearMap(map);
for (Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println(entry.getKey());
}
if (map.isEmpty()) {
System.out.println("empty");
}
}
private void clearMap (Map<Integer , String> map) {
for (Map.Entry<Integer, String> entry : map.entrySet()) {
if (entry.getValue() == null) {
map.remove(entry.getKey());
}
}
}
}
上述代码中有①②③三处注释,
情况1:下面我们让②③都注释上,代码运行后不出错(自己运行,这里不贴出运行结果了),
情况2:注释掉①,②③不注释,代码运行后也不出错
情况3:①②③不注释,运行代码后出错,比较一下就知道了区别了,这种情况中,map被中有2个value为空的数据,所以map会被remove2次。
原因:对map进行修改操作是,下一次的修改会被认为是对原对象的修改,而其实被修改的对象已经不是原对象了,所以会造成当前修改异常java.util.ConcurrentModificationException。
知道原因就好解决了,解决办法自己想吧,哈。
下面是我所用到的解决办法,比较土。应该也还有别的方法可以解决该问题。
view plain
/**
*
* Dec 1, 2011
* @author 车前猛跑
*/
public class MapDemo {
public static void main (String [] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(5, null); //①
map.put(1, "a"); //②
map.put(3, null); //③
MapDemo md = new MapDemo();
Map<Integer , String> newmap = md.clearMap(map); // 通过新map返回数据
for (Map.Entry<Integer, String> entry : newmap.entrySet()) {
System.out.println(entry.getKey());
}
if (map.isEmpty()) {
System.out.println("empty");
}
}
private Map<Integer , String> clearMap (Map<Integer , String> map) {
Map<Integer , String> retmap = new HashMap<Integer , String>();
for (Map.Entry<Integer, String> entry : map.entrySet()) {
if (entry.getValue() != null) {
retmap.put(entry.getKey(), entry.getValue());
}
}
return retmap; // 通过新map返回数据
}
}
问题解决了。
分享到:
相关推荐
java.util.ConcurrentModificationException 异常问题详解1
java.util.ConcurrentModificationException 解决方法 在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。 则使用会报以下异常: Java.util....
主要介绍了出现java.util.ConcurrentModificationException 问题及解决办法的相关资料,需要的朋友可以参考下
Spring数据mongodb测试 在Collections.synchronizedList或Collections.synchronizedSet上测试spring数据mongodb ConcurrentModificationException
Map在遍历时候通常 现获得其键值的集合Set,然后用迭代器Iterator来对Map进行遍历。
java.util.ConcurrentModificationException: mutation occurred during iteration [error] scala.collection.mutable.MutationTracker$.checkMutations(MutationTracker.scala:43) [error] scala.collection....
java中,List在遍历的时候,如果被修改了会抛出java.util.ConcurrentModificationException错误。 看如下代码: import java.util.ArrayList; import java.util.List; public class Resource3 { public ...
请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 43.请写一个java程序实现线程连接池功能? 44.给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46....
JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...
超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...