黑马程序员技术交流社区

标题: ArrayList中的问题,为什么会发生异常呢? [打印本页]

作者: vaqh    时间: 2014-7-31 17:24
标题: ArrayList中的问题,为什么会发生异常呢?
本帖最后由 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();
                }


作者: Bule丶    时间: 2014-7-31 17:49
哪里发成异常了?
作者: star5603    时间: 2014-7-31 18:20
it.remove()不可以吧。。。
作者: vaqh    时间: 2014-7-31 18:38
star5603 发表于 2014-7-31 18:20
it.remove()不可以吧。。。

为什么会这样呢
作者: star5603    时间: 2014-7-31 18:42
你确实是it.remove可以么,我记得它里面没remove这个方法。

作者: vaqh    时间: 2014-7-31 18:45
star5603 发表于 2014-7-31 18:42
你确实是it.remove可以么,我记得它里面没remove这个方法。

对哦,,好像是,我在看看
作者: star5603    时间: 2014-7-31 18:53
vaqh 发表于 2014-7-31 18:45
对哦,,好像是,我在看看

你用al.remove可以,但是也会错。
用集合操作(删除添加)元素,迭代器是不知道的,会发生异常。
只能用ListIterator
作者: 格子、    时间: 2014-7-31 18:54
楼主是   //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);
复制代码

作者: 于龙超123    时间: 2014-7-31 18:58
可以运行的~你用的用迭代器遍历同时又用迭代器修改集合是不会出现“并发异常”;如果上面你用al对象增删集合元素肯定就会出现”并发异常了“,    还有建议加上泛型如:
ArrayList al = new ArrayList();-------->ArrayList<String> al = new ArrayList<String>();                                         
Iterator it = al.iterator();------>Iterator<String> it = al.iterator();
作者: 怀念黑海岸    时间: 2014-7-31 19:49
  如果就是执行这段代码是不会报错的,而且也能达到删除list中元素的结果,因为Iterator迭代器中有remove方法,但是如果执行注释的语句的话那么就会发生一个运行时异常-并发修改异常,产生这个异常的原因是因为使用迭代器的过程中使用了迭代器中没有的功能,添加方法。如果想要消除这个异常也容易,使用List集合中的特有迭代器:ListIterator,这个迭代器中的方法就很多了,其中就有add方法。使用了这个迭代器后,当我们在用迭代器对List集合进行遍历时就可以进行增删改查的一系列的操作了。
作者: Moriarty    时间: 2014-7-31 19:57
你的这个代码应该不会产生异常,因为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);
        }
}
作者: vaqh    时间: 2014-7-31 20:00
格子、 发表于 2014-7-31 18:54
楼主是   //al.add("java08");这句报的异常吧,异常名字为 java.util.ConcurrentModificationException,这 ...

谢谢了,,,,,
作者: vaqh    时间: 2014-7-31 20:04
谢谢大家,问题已近解决




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2