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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李征雪 于 2012-4-10 11:19 编辑
  1. //Demo1403.java
  2. import java.util.*;

  3. class Demo1403
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 ArrayList al = new ArrayList();
  8.                 //Iterator it = al.iterator();

  9.                 al.add("hello");
  10.                 al.add("world");
  11.                 al.add("java");
  12.                 al.add("hello");

  13.                 Iterator it = al.iterator();

  14.                 while(it.hasNext())
  15.                         System.out.println(it.next());

  16.                 System.out.println("Hello World!");
  17.         }
  18. }
复制代码
帮我看看第9行和第16行的代码Iterator it = al.iterator();,为什么相同一代码定义在al.add()前面会报错?
it不是个对象吗?不是应该定义在哪都一样吗?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

7 个回复

倒序浏览
Iterator it = al.iterator();迭代器 是对集合取数据用的 还没有存数据  就直接取  会出异常------ 没有这个元素异常
不报异常你可以用LinkedList 1.6新特性用 offer添加数据. 但是回返回null,不出异常

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 郑苑东 于 2012-4-10 09:58 编辑

迭代时不允许其他线程修改集合中的内容。。而这时你定义在下面使用add修改了集合a1中的内容。。所以抛出了运行时异常ConcurrentModificationException。。。一个集合一旦定义了迭代。。那么你不能修改这个集合。。要不你迭代完修改。。而单线程的程序。。你违反了集合的顺序。。先往集合中加入元素。然后定义迭代器。的顺序也会抛出这个异常。。。。加入完成集合后再定义迭代就不会了。。或者你定义了迭代结束后。。在往其中加入元素。。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
koma501 发表于 2012-4-10 09:52
Iterator it = al.iterator();迭代器 是对集合取数据用的 还没有存数据  就直接取  会出异常------ 没有这 ...

你错了 。。你自己去运行一个。。然后看看抛出的异常是什么异常。。
回复 使用道具 举报
郑苑东 发表于 2012-4-10 09:59
你错了 。。你自己去运行一个。。然后看看抛出的异常是什么异常。。

ConcurrentModificationException并发修改异常
回复 使用道具 举报
本帖最后由 郑苑东 于 2012-4-10 10:18 编辑
koma501 发表于 2012-4-10 10:08
ConcurrentModificationException并发修改异常


我知道。。我不是写了吗。。你回复我。害我以为得分了。。坑我啊。。我也回复你一个。。。给你个惊喜。。。不过这里不是并发异常。。这是在主线程main中。只有一条线程。。所以没有什么线程并发修改的。。。这是因为他违反了定义集合的顺序。。要先加入元素。。然后迭代。。迭代完了才能在加入。。而上面他定义了之后什么也没有做。。这个异常介绍中有写。。。在加入元素之后使用了加入元素之前的迭代。。所以才会这样。。这样也算违反了规定啊。。。
回复 使用道具 举报
是这样的:
Iterator 是一个工作在独立的线程中的,Iterator被创建之后同时也创建了指向原来对象的单链索引表,
当原来的对象发生变化的时候,这个索引表的对象是不会同步放生变化的,也就是说:如果你的Iterator对象
放在了add方法的前面,当你在向list中添加数据的时候 原来的list中的内容是不会同步放生变化的,
所以就会抛出:java.util.ConcurrentModificationException

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
谢谢大家,现在明白了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马