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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© vaqh 中级黑马   /  2014-7-31 17:24  /  1521 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 vaqh 于 2014-7-31 20:02 编辑

ArrayList al = new ArrayList();
               
                //添加元素
                al.add("java01");
                al.add("java02");
                al.add("java03");
               
                Iterator it = al.iterator();
                while(it.hasNext())
                {
                        Object obj = it.next();
                        if(obj.equals("java02"))
                                //al.add("java08");
                                it.remove();
                }

评分

参与人数 1技术分 +1 收起 理由
张然龙 + 1 神马都是浮云

查看全部评分

12 个回复

倒序浏览
哪里发成异常了?
回复 使用道具 举报
it.remove()不可以吧。。。
回复 使用道具 举报
star5603 发表于 2014-7-31 18:20
it.remove()不可以吧。。。

为什么会这样呢
回复 使用道具 举报
你确实是it.remove可以么,我记得它里面没remove这个方法。
回复 使用道具 举报
star5603 发表于 2014-7-31 18:42
你确实是it.remove可以么,我记得它里面没remove这个方法。

对哦,,好像是,我在看看
回复 使用道具 举报
vaqh 发表于 2014-7-31 18:45
对哦,,好像是,我在看看

你用al.remove可以,但是也会错。
用集合操作(删除添加)元素,迭代器是不知道的,会发生异常。
只能用ListIterator
回复 使用道具 举报
楼主是   //al.add("java08");这句报的异常吧,异常名字为 java.util.ConcurrentModificationException,这是方法检测到对象的并发修改,但不允许这种修改时,抛出的异常。也就是说在迭代过程中是不允许添加元素的!但是remove是可以的!
想要在迭代过程中操作Iterator的子类ListIterator是可以完成的,我把代码修改了一下,楼主可以参考一下!
  1. ArrayList al = new ArrayList();

  2.                 // 添加元素
  3.                 al.add("java01");
  4.                 al.add("java02");
  5.                 al.add("java03");
  6.                 System.out.println(al);
  7.                 ListIterator it = al.listIterator();
  8.                 while (it.hasNext()) {
  9.                         Object obj = it.next();
  10.                         if (obj.equals("java02"))
  11.                                 //it.remove();
  12.                                 it.add("java08");
  13.                 }
  14.                 System.out.println(al);
复制代码

评分

参与人数 1技术分 +1 收起 理由
张然龙 + 1

查看全部评分

回复 使用道具 举报
可以运行的~你用的用迭代器遍历同时又用迭代器修改集合是不会出现“并发异常”;如果上面你用al对象增删集合元素肯定就会出现”并发异常了“,    还有建议加上泛型如:
ArrayList al = new ArrayList();-------->ArrayList<String> al = new ArrayList<String>();                                         
Iterator it = al.iterator();------>Iterator<String> it = al.iterator();
回复 使用道具 举报
  如果就是执行这段代码是不会报错的,而且也能达到删除list中元素的结果,因为Iterator迭代器中有remove方法,但是如果执行注释的语句的话那么就会发生一个运行时异常-并发修改异常,产生这个异常的原因是因为使用迭代器的过程中使用了迭代器中没有的功能,添加方法。如果想要消除这个异常也容易,使用List集合中的特有迭代器:ListIterator,这个迭代器中的方法就很多了,其中就有add方法。使用了这个迭代器后,当我们在用迭代器对List集合进行遍历时就可以进行增删改查的一系列的操作了。

评分

参与人数 1技术分 +1 收起 理由
张然龙 + 1

查看全部评分

回复 使用道具 举报
你的这个代码应该不会产生异常,因为Interator类是支持remove()方法的而且从JDK1.2就有了你可以查文档,反正我是可以执行的,而如果你要用Interator的add()方法那他会出现异常因为Interator中并没有add()方法。用listIterator迭代器,它有add()方法,那你可以考虑以下代码。只能本人水平有限,如果哪里错了请大神指点一下。
import java.util.*;
public class xxx
{
        public static void main(String[] args)
        {
                ArrayList al = new ArrayList();
               
                //添加元素
                al.add("java01");
                al.add("java02");
                al.add("java03");     
                ListIterator it = al.listIterator();
        while(it.hasNext())
        {
              Object obj = it.next();
              if(obj.equals("java02"))
              it.add("java08");
                 
        }
                System.out.println(al);
        }
}

评分

参与人数 1技术分 +1 收起 理由
张然龙 + 1

查看全部评分

回复 使用道具 举报
vaqh 中级黑马 2014-7-31 20:00:49
12#
格子、 发表于 2014-7-31 18:54
楼主是   //al.add("java08");这句报的异常吧,异常名字为 java.util.ConcurrentModificationException,这 ...

谢谢了,,,,,
回复 使用道具 举报
vaqh 中级黑马 2014-7-31 20:04:28
13#
谢谢大家,问题已近解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马