在Java中使用Iterator类

时间:2014-10-22 16:53:44

标签: java iterator concurrentmodification

我正在尝试使用Iterator,但它给了我这个错误:

  

java.util.concurrentModificationException:null(in   的java.util.ArrayList $ ITR)

代码在这里:

import java.util.ArrayList;
import java.util.Iterator;

public class Iteratorr
{    
  ArrayList<String> list = new ArrayList<>();
  Iterator<String> it = list.iterator();

  void add()
  {
    list.add("Hello");
    list.add("I");
    list.add("am");
    list.add("ArrayList");
  }

  void print()
  {   
    while(it.hasNext()) 
    {
      String str = it.next();
      System.out.println(str);
    }
  }      
}

有谁可以解释原因?

3 个答案:

答案 0 :(得分:3)

事件顺序如下:

  1. 您为(空)列表创建一个迭代器。
  2. 您可以在列表中添加元素。
  3. 您开始使用在步骤1中创建的迭代器。
  4. 这不会起作用,因为第2步使迭代器无效。这就是异常告诉你的。来自Javadoc

      

    [ArrayList&#39; s] iteratorlistIterator方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时候对列表进行结构修改,除了通过迭代器自己的removeadd方法之外,迭代器将抛出ConcurrentModificationException

    您需要在开始迭代之前创建迭代器:

    public class Iteratorr
    {    
      ...
      Iterator<String> it = null;
    
      void print() {
        it = list.iterator();
        while(it.hasNext()) {
          String str = it.next();
          System.out.println(str);
        }
      }      
    

    (更好的方法是在it内声明print而不是作为班级成员。)

    现在写这种循环的惯用方法是

      void print() {
        for (String str : list) {
          System.out.println(str);
        }
      }      
    

    它与使用显式迭代器具有相同的效果,但在眼睛上更容易。

答案 1 :(得分:2)

在对列表进行最后一次更改后,您必须检索迭代器! 否则它将是一个不同的迭代器,它不会“知道”新List的内容。

隐含地利用(默认)迭代器的更优雅方式:

void print()
{   
    for(String str : list) 
    {
        System.out.println(str);
    }
}

虽然这可能更适合理解,特别是如果您想稍后定义自己的迭代器:

void print()
{   
    Iterator<String> it = list.iterator();

    while(it.hasNext()) 
    {
        System.out.println(it.next());
    }
} 

答案 2 :(得分:0)

该Excpption取决于您如何调用该方法。您可以在方法中本地使用变量,如下所示。

void print()
{   
    ArrayList<String> list = new ArrayList<>();

    //Add elements here
    add(list);

    Iterator<String> it = list.iterator();

    while(it.hasNext()) {

        String str = it.next();

        System.out.println(str);
    }

}

void add( List list)
    {
        list.add("Hello");
        list.add("I");
        list.add("am");
        list.add("ArrayList");
    }