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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨文宇 中级黑马   /  2012-8-7 18:20  /  1944 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨文宇 于 2012-8-7 18:25 编辑

class Test {
        
        public static void main(String[] args) {
                List list = new ArrayList();
                list.add("aaa");
                list.add("bbb");
                list.add("ccc");
                ListIterator it = list.listIterator();
                while(it.hasNext()){
                it.next();
                list.add("111");//为什么这里调用add方法会报错。
                }
                System.out.println(list);
        }
}


Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at javaEnhance.Test.main(Test.java:33)
这是什么异常

5 个回复

倒序浏览
iterator是在一个独立线程工作的,是有一把锁的。当iterator被创建的时候,他有一个指针指向原来的对象,并且他自己的一个索引表,当你用不是迭代器的方法对容器操作时,迭代器有可能找到的对象和容器中的对象是不同的,所以就会引发这个错误。
对集合操作的时候,最好别混用
回复 使用道具 举报
嘿嘿,帮你顶一下,记者回来看帖哦!
回复 使用道具 举报
本帖最后由 张雪磊 于 2012-8-7 19:36 编辑

本帖最后由 杨文宇 于 2012-8-7 18:25 编辑


class Test {
        
        public static void main(String[] args) {
                List list = new ArrayList();
                list.add("aaa");
                list.add("bbb");
                list.add("ccc");
                ListIterator it = list.listIterator();
                while(it.hasNext()){
                it.next();
                list.add("111");//为什么这里调用add方法会报错。//list.add("111")改成 li.add("111");
                }
                System.out.println(list);
        }
}


Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at javaEnhance.Test.main(Test.java:33)  

这是并发修改异常,当你定义了迭代器的时候,你的集合里边的数据就有两个方法在操作它们了,一个是集合的方法,一个是迭代器的方法,你在用迭代器迭代集合的时候用的是迭代器,如果这时候你再用集合的方法对集合进行添删操作,就冲突了,你把错误的代码用迭代器的add方法添加就好了,具体造作把错误代码改成红色部分


















1.jpg (48.76 KB, 下载次数: 24)

这个是LIstIterator里的方法

这个是LIstIterator里的方法
回复 使用道具 举报
}

class Test {
   
    public static void main(String[] args) {
            List list = new ArrayList();
            list.add("aaa");
            list.add("bbb");
            list.add("ccc");
            ListIterator it = list.listIterator();
            while(it.hasNext()){
            //it.next();
            //list.add("111");//为什么这里调用add方法会报错。  因为在迭代器中使用了集合的方法,如果改为li.add("111")并把他和上面代码换个位置就能运行
            it.add("111");//注意 这个语句不能放在下面,可以理解成在迭代过程中整个list的状态不能发生改变。
            it.next();
            }
            System.out.println(list);
    }
}

按照我这样就可以通过。
回复 使用道具 举报
public void add(E e) {
            checkForComodification();

            try {
                int i = cursor;
                AbstractList.this.add(i, e);
                lastRet = -1;
                cursor = i + 1;
                expectedModCount = modCount;//-------(1)
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }
private void checkForComodification() {
        if (this.modCount != l.modCount)       //------(2)
            throw new ConcurrentModificationException();
    }

还是不太懂,是不是和上面两个标志的代码有关?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马