A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘辉 中级黑马   /  2013-3-16 21:33  /  1250 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
class  IteratorDemo
{
        public static void main(String[] args) throws Exception
        {
                Collection c=new ArrayList();
                Iterator it=c.iterator();
                c.add("hello");
                c.add("world");
                c.add("java");

                System.out.println("c:"+c);
                while(it.hasNext())
                {
                        Object obj=it.next();
                        System.out.println(obj);
                }
        }
}
怎么会报这个异常?求解。。
ConcurrentModificationException

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

正序浏览
list集合你还没有添加的时候就用了集合c的对象
把 Iterator it=c.iterator();写在c.add之后就OK了
回复 使用道具 举报
  public static void main(String[] args) throws Exception
        {
               ArrayList c=new ArrayList();
              //  Iterator it=c.iterator();//提示:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
                                                                               //因为你迭代集合的时候,你又去修改原集合(包括,添加,删除能引起原集合长度发生改变的都是不行),必然会引出问题。
                                                                               //如果要用,可以用迭代器提供的方法。
                c.add("hello");
                c.add("world");
                c.add("java");
                Iterator it=c.iterator();//这样就不会有那种现象了。
               
               System.out.println("c:"+c);
                while(it.hasNext())
                {
                        Object obj=it.next();
                        System.out.println(obj);
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 彭颖 于 2013-3-16 21:57 编辑

Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
  1. import java.util.*;
  2. public class TestDemo {


  3.                 public static void main(String[] args) throws Exception
  4.                 {
  5.                         Collection c=new ArrayList();
  6.                         Iterator it=c.iterator();
  7.                         c.add("hello");
  8.                         c.add("world");
  9.                         c.add("java");

  10.                         System.out.println("c:"+c);
  11.                     /*    while(it.hasNext())
  12.                         {
  13.                                 Object obj=it.next();
  14.                                 System.out.println(obj);
  15.                         }*/
  16.                         for(Object o : c){
  17.                             System.out.print(o);
  18.                        }
  19.                 }
  20.         }

复制代码
--------------------------------------------
我觉得这样改动一样吧

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
这是一个非捕获型异常
通过Iterator进行遍历,如果直接对ArrayList集合进行操作后,再继续用之前的Iterator进行遍历就会出现这个异常,表示其ArrayList集合已经被修改
将Iterator那条语句放后面来就好了
  1. import java.util.*;
  2. class  IteratorDemo
  3. {
  4.         public static void main(String[] args) throws Exception
  5.         {
  6.                 Collection c=new ArrayList();
  7.                 //Iterator it=c.iterator();
  8.                 c.add("hello");
  9.                 c.add("world");
  10.                 c.add("java");

  11.                 System.out.println("c:"+c);
  12.                                 Iterator it=c.iterator();//------------该语句放在操作完之后
  13.                 while(it.hasNext())
  14.                 {
  15.                         Object obj=it.next();
  16.                         System.out.println(obj);
  17.                 }
  18.         }
  19. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Exception in thread "main" java.util.ConcurrentModificationException:并发修改异常
在使用迭代器迭代元素的时候,不能使用集合去操作元素,否则,就会出现并发修改异常。
解决办法:
迭代器迭代的过程中,使用迭代器对象去添加元素。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马