zoukankan      html  css  js  c++  java
  • java.util.ConcurrentModificationException异常情形1

    出现这种异常,网上有很多中情况解释,下面是出现这种异常的另外一种方式避免的解决方案:

    public static void main(String[] args) {
            Map<String, Object> map1 = Maps.newLinkedHashMap();
            map1.put("one", 11);
            map1.put("one1", 11);
            map1.put("one2", 11);
            map1.put("one3", 11);
            Map<String, Object> map2 = Maps.newHashMap();
            map2.put("one", 11);
            map2.put("one1", 11);
            map2.put("one2", 11);
            map2.put("one3", 11);
            Map<String, Object> map3 = Maps.newHashMap();
            map3.put("one", 11);
            map3.put("one1", 11);
            map3.put("one2", 11);
            map3.put("one3", 11);
            Map<String, Object> map4 = Maps.newHashMap();
            map4.put("one", 44);
            map4.put("one1", 44);
            map4.put("one2", 11);
            map4.put("one3", 11);
            List<Map<String, Object>> mapList = Lists.newArrayList();
            mapList.add(map1);
            mapList.add(map2);
            mapList.add(map3);
            mapList.add(map4);
            for (int i = 0; i < mapList.size(); i++) {
                mapList = Collections.synchronizedList(mapList);
                for (Map<String, Object> map : mapList) {
                    // 对每个map插入key-value
                    // 出现异常:java.util.ConcurrentModificationException,为什么需要遍历map的keySet呢?直接改成map.containsKey()就可以避免了
    //                for (String mapKey : map.keySet()) {
    //                    if ("one".equals(mapKey)) {
    //                        map.put("111", "oneoneone");
    //                    }
    //                }
                    if (map.containsKey("one")) {
                        map.put("111", "oneoneone");
                    }
                    
                    // 对每个map删除key-value
                    Set<Map.Entry<String,Object>> entries = map.entrySet();
                    Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
                    while (iterator.hasNext()) {
                        Map.Entry<String, Object> next = iterator.next();
                        if ("one".equals(next.getKey())) {
                            iterator.remove();
                        }
                    }
                }
            }
            mapList.forEach(System.out::println);
        }

    结果展示:

    异常>>>>>> 出错演示:

    代码演示:

    public static void main(String[] args) {
            Map<String, Object> map1 = Maps.newLinkedHashMap();
            map1.put("one", 11);
            map1.put("one1", 11);
            map1.put("one2", 11);
            map1.put("one3", 11);
            Map<String, Object> map2 = Maps.newHashMap();
            map2.put("one", 11);
            map2.put("one1", 11);
            map2.put("one2", 11);
            map2.put("one3", 11);
            Map<String, Object> map3 = Maps.newHashMap();
            map3.put("one", 11);
            map3.put("one1", 11);
            map3.put("one2", 11);
            map3.put("one3", 11);
            Map<String, Object> map4 = Maps.newHashMap();
            map4.put("one", 44);
            map4.put("one1", 44);
            map4.put("one2", 11);
            map4.put("one3", 11);
            List<Map<String, Object>> mapList = Lists.newArrayList();
            mapList.add(map1);
            mapList.add(map2);
            mapList.add(map3);
            mapList.add(map4);
            for (int i = 0; i < mapList.size(); i++) {
                mapList = Collections.synchronizedList(mapList);
                for (Map<String, Object> map : mapList) {
                    // 对每个map插入key-value
                    // 出现异常:java.util.ConcurrentModificationException,为什么需要遍历map的keySet呢?直接改成map.containsKey()就可以避免了
                    for (String mapKey : map.keySet()) {
                        if ("one".equals(mapKey)) {
                            map.put("111", "oneoneone");
                        }
                    }
    //                if (map.containsKey("one")) {
    //                    map.put("111", "oneoneone");
    //                }
                    
                    // 对每个map删除key-value
                    Set<Map.Entry<String,Object>> entries = map.entrySet();
                    Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
                    while (iterator.hasNext()) {
                        Map.Entry<String, Object> next = iterator.next();
                        if ("one".equals(next.getKey())) {
                            iterator.remove();
                        }
                    }
                }
            }
            mapList.forEach(System.out::println);
        }

    出错异常结果:

    Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:719)
        at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:742)
        at com.uxseeing.test.CrossAnalyticsTest.main(CrossAnalyticsTest.java:205)

  • 相关阅读:
    PKU JudgeOnline 题目分类
    调试时拼凑带端口的完整网址/域名
    智能电脑监控器,完美解决想监控别人在自己电脑上的一切操作。
    如何清理LDF文件
    使用母版页后FindConttol需要注意
    【外刊IT评论】代码覆盖率:80%,不能少
    推荐2本普通人参悟的书
    处理在母版页加AJAX环境下处理滚动条回发保持不动的问题
    虚拟目录中的web.config不被上级目录的web.config影响的处理
    C++中^符号的意思
  • 原文地址:https://www.cnblogs.com/superdrew/p/11431090.html
Copyright © 2011-2022 走看看