`

java.util.ConcurrentModificationException产生原因及解决办法

阅读更多
第一次遇到此异常是在处理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 异常问题详解 ConcurrentModificationException 异常是 Java 中一个常见的异常,它发生在 Iterator 遍历集合时,集合同时被修改引起的异常。在 Java 中,集合类如 ...

    java.util.ConcurrentModificationException 解决方法

    java.util.ConcurrentModificationException 解决方法 在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。 则使用会报以下异常: Java.util....

    出现java.util.ConcurrentModificationException 问题及解决办法

    在Java编程中,`java.util.ConcurrentModificationException` 是一个常见的运行时异常,通常发生在尝试并发修改集合时。这个异常的产生是由于集合类(如HashMap)的非线程安全特性,当你在一个线程中使用迭代器遍历...

    java.util.ConcurrentModificationException(解决方案).md

    常见问题

    java 集合并发操作出现的异常ConcurrentModificationException

    在Java编程中,`ConcurrentModificationException`是一个常见的运行时异常,主要出现在多线程环境下对集合类(如List、Set、Map等)进行并发修改时。然而,这个异常不仅限于多线程环境,即使在单线程中,如果在遍历...

    Java语言的Util类详细介绍

    Java语言的Util类详细介绍 Java语言的Util类是Java开发中非常重要的一部分,它提供了一系列的类来实现基本的数据结构,如线性表、链表等。这些类均在java.util包中。 Collection接口是Java中最基本的集合接口,一...

    spring-data-mongodb-test:在Collections.synchronizedList或Collections.synchronizedSet上测试spring数据mongodb ConcurrentModificationException

    Spring数据mongodb测试 在Collections.synchronizedList或Collections.synchronizedSet上测试spring数据mongodb ConcurrentModificationException

    JAVA.BUG模式详解

    本篇文章将深入探讨几个常见的JAVA.BUG模式,并提供相应的解决策略和优化技巧。 一、空指针异常(NullPointerException) 这是Java中最常见的错误之一,当尝试访问一个为null的对象的成员时,程序会抛出此异常。...

    遍历并批量删除容器中元素出现ConcurrentModificationException原因及处置

    在Java编程中,`ConcurrentModificationException`是一个常见的运行时异常,通常发生在多线程环境下对集合进行迭代和修改操作时。此问题的核心在于,Java的集合类(如ArrayList、LinkedList、HashSet等)并不支持...

    Java多线程安全集合

    Java的`java.util.concurrent`包提供了更为高效且专门设计用于并发操作的集合。比如: - `ConcurrentHashMap`:线程安全的哈希映射,比`synchronized Map`性能更好,因为它允许不同部分独立加锁,减少了锁竞争。 ...

    java8集合源码-zinc-ConcurrentModificationException:锌并发修改异常

    java.util.ConcurrentModificationException: mutation occurred during iteration [error] scala.collection.mutable.MutationTracker$.checkMutations(MutationTracker.scala:43) [error] scala.collection....

    多线程中使用Java集合类.doc

    在多线程环境中,使用Java集合类需要注意线程安全问题,因为不同的线程可能会同时访问和修改集合,导致数据不一致或引发异常。本篇主要讨论在并发编程中使用Java集合类的一些关键知识点。 首先,Java集合框架中的大...

    jdk 1.6 API 中文版帮助文档

    - `java.util.Iterator`的改进:支持`remove()`操作,避免抛出`ConcurrentModificationException`。 ### 4. 性能优化 JDK 1.6对编译器和垃圾收集器进行了优化,提高了运行效率,例如: - **Server VM的改进**: ...

    迭代大师的修炼之道:Java中Iterator与增强for循环的深度解析

    ### 迭代大师的修炼之道:Java中Iterator与Enhanced for loop的深度解析 #### 一、引言 在Java编程的世界里,迭代是处理集合数据的重要手段之一。本文将重点探讨两种常用的迭代方式——`Iterator`接口和`Enhanced ...

    Java源码分析:深入探讨Iterator模式

    在Java编程语言中,集合框架(`java.util`包)提供了多种容器类来存储对象,如`List`、`Set`和`Map`等。为了遍历这些容器中的元素,Java引入了迭代器模式(Iterator Pattern),这是一种常用的设计模式,它提供了一...

    concurrent.rar

    Java并发包,也被称为`java.concurrent`包,是Java编程语言中处理多线程和并发操作的核心工具包。它提供了一系列高效、线程安全的类和接口,使得开发者能够更安全、更容易地编写多线程应用程序。这个压缩包`...

    Java 7编程高级进阶

    `java.util.concurrent.ForkJoinPool`和`java.util.concurrent.RecursiveTask`是其核心类。 7. **非阻塞堆栈跟踪(Non-blocking Stack Traces)** 当线程处于等待状态时,Java 7可以生成不包含阻塞信息的堆栈跟踪...

Global site tag (gtag.js) - Google Analytics