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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐进 中级黑马   /  2012-10-22 14:18  /  1588 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

List list=new ArrayList();
                list.add("aa");
                list.add("bb");
                list.add("cc");
                Iterator iterator=list.iterator();
                while(iterator.hasNext()){
                       String string=(String)iterator.next();
                       if(string.equals("cc")){
                               list.remove(string);
                       }
                       else {
                                System.out.println(string);
                        }
                }
为什么会报异常,急,请大家帮忙看看!

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 淡定

查看全部评分

9 个回复

倒序浏览
           List list=new ArrayList();
       list.add("aa");
       list.add("bb");
       list.add("cc");
       Iterator iterator=list.iterator();
       while(iterator.hasNext()){
              String string=(String)iterator.next();
              if(string.equals("cc")){
                      iterator.remove();              }
              else {
                       System.out.println(string);
               }
       }
   }
程序这样写就对了,因为remove()是Iterator接口中的方法,移除当前元素,应该是Iterator接口的实例调用

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 黄小贝 于 2012-10-22 14:34 编辑

迭代器遍历时,会把容器数据锁住,当你再试图修改其中的内容时,会抛出java.util.ConcurrentModificationException异常,从异常的名字也可以看出来



建议改成 for

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
王健宇 发表于 2012-10-22 14:27
List list=new ArrayList();
       list.add("aa");
       list.add("bb");

少侠,你确定这样编译的过?
回复 使用道具 举报
有问题吗?求教!
回复 使用道具 举报
List list=new ArrayList();
                list.add("aa");
                list.add("bb");
                list.add("cc");
                Iterator iterator=list.iterator();
                while(iterator.hasNext()){
                       String string=(String)iterator.next();
                       if(string.equals("cc")){
                               list.remove(string);
                       }
                       else {
                                System.out.println(string);
                        }
                }

在使用迭代器操作集合的时候是不可以使用集合方法中操作集合的.

解决方法:
第一种 你可以使用迭代器中的方法在对集合进行迭代时,进行其他的操作.

第二种 因为你操作的是List集合,是一个有序的集合,你也可以使用Lise集合中的get方法获取指定角标下的元素,判断如果条件成立再用操作集合的方法操作集合

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
黄小贝 发表于 2012-10-22 14:36
少侠,你确定这样编译的过?

这个方法可以呀,在迭代过程中使用迭代器中的方法操作集合中的元素.
回复 使用道具 举报
杨政 中级黑马 2012-10-22 14:51:42
8#
你似乎是以为remove()方法是需要传入元素从而移除传入元素吧。

看API里remove()方法的说明:从迭代器指向的集合中移除迭代器返回的最后一个元素。

remove()方法无传入参数,移除的是当前iterator.next()指向的元素。

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 黄小贝 于 2012-10-22 15:30 编辑
王健宇 发表于 2012-10-22 14:41
有问题吗?求教!

嗯,这里是我的问题,刚才看错了,以为你用的list.remove,我以前遇到这个问题的时候都是用for循环解决的,今天才知道可以用iterator接口中的remove解决,惭愧~

刚才dubug了一下,发现了抛出异常的原因,以及为什么iterator接口中的remove就可以解决这个问题

首先看ArrayList的 iteratior的实现,实际实现为AbstractList的一个内部类

看看具体实现,我一直以为异常是在调用remove(object)的时候抛出的,实际上是在调用完后的next函数中抛出的



在看看list.remove(object)的实现,在ArrayList中


回复 使用道具 举报
唐进 中级黑马 2012-10-22 15:30:20
10#
王健宇 发表于 2012-10-22 14:27
List list=new ArrayList();
       list.add("aa");
       list.add("bb");

这个方法可以,学到一招了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马