本文主要是介绍java.util.ConcurrentModificationException产生原因及解决办法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
现象
第一次遇到此异常是在处理3g.renren.com的好友分组功能中,因为接口提供的好友分组(以map的方式提供好友分组的id跟分组名)中没有把分组名为空,但是id存在的数据屏蔽掉,所以我在调用接口服务之后,需要重新处理value为空的数据。
代码如下:
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。
解决方法
使用iterator.remove()
方法则不会有问题,因为它不会并发修改集合的结构。
这篇关于java.util.ConcurrentModificationException产生原因及解决办法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!