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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余善航 中级黑马   /  2013-2-6 21:57  /  1757 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package aaa;

import java.util.ArrayList;

import java.util.ListIterator;

public class String_a {
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }

        public static void main(String[] args) {
               
                ArrayList a1=new ArrayList();
                a1.add("java01");
                a1.add("java02");
               
       
                ListIterator ls=a1.listIterator();
                while(ls.hasNext())
                {
                        Object obj=ls.next();;
                       
                        if(obj.equals("java02"))
                        {
                                a1.add("jaadd");
                               
                        }
                       
                }
                sop(a1);
                       
       
        }
       

}



控制台错误
Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
        at java.util.AbstractList$Itr.next(Unknown Source)
        at aaa.String_a.main(String_a.java:23)

//  不明白???

7 个回复

倒序浏览
package aaa;

import java.util.ArrayList;

import java.util.ListIterator;

public class String_a {
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }

        public static void main(String[] args) {
               
                ArrayList a1=new ArrayList();
                a1.add("java01");
                a1.add("java02");
               
        
                List  Iterator ls=a1.listIterator();//这里的问题
                while(ls.hasNext())
                {
                        Object obj=ls.next();;
                        
                        if(obj.equals("java02"))
                        {
                                a1.add("jaadd");
                                
                        }
                        
                }
                sop(a1);
                        
        
        }
        

}

//在试试
回复 使用道具 举报
  1. if (obj.equals("java02")) {
  2.                                 ls.add("jaadd");
  3.                         }
复制代码
集合迭代期间,为保证数据的一致性,不能对集合中的元素进行操作,如果一定要用,只能使用迭代器中的方法(不建议)
回复 使用道具 举报
这个视频上有讲啊 ,抛出ConcurrentModificationException异常  是当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。
如果检测到这种行为,一些迭代器实现可能选择抛出此异常。
      List  Iterator ls=a1.listIterator();
                while(ls.hasNext())
                {
                        Object obj=ls.next();;
                        
                        if(obj.equals("java02"))
                        {
                                a1.add("jaadd");//这里楼主用迭代时 有用了集合的方法进行存储 所以就会抛出ConcurrentModificationException异常
                                
                        }


回复 使用道具 举报
这个问题我前两天正好刚遇到过.
   首先这个异常的解释ConcurrentModificationException  当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。
   你在获取当前对象的迭代器后又用  a1.add("jaadd")对当前对象进行
修改, 迭代器就不高兴了.
回复 使用道具 举报
杨芳 来自手机 中级黑马 2013-2-7 07:46:23
地板
迭代时,为保证数据一致性,通常不充许同时操作数据,Is.next()后多了个;号。来自: Android客户端
回复 使用道具 举报
你又在用迭代器进行遍历又在用集合进行添加
你要么用直接遍历集合 要么用迭代器进行添加
回复 使用道具 举报
  ListIterator ls=a1.listIterator();
这样的声明编译没有问题,  这属于Iterator 还是LIstIterator
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马