使用Iterator时出现ConcurrentModificationException

时间:2014-02-23 13:36:30

标签: java arraylist

我正在尝试使用Iterator迭代ArrayList。问题是我得到了ConcurrentModificationException。我检查了很多像这样的问题。所有人都说当你在迭代它时修改ArrayList时会发生异常。但我认为我的问题有点不同,因为即使使用ArrayList方法我也不会修改Iterator

        Cliente cliente1 = new Cliente(16096,"Alberto1","pass",1500.0,false);

    ArrayList<Cliente> miLista = new ArrayList<Cliente>();

    Iterator<Cliente> miIterador = miLista.iterator();

    miLista.add(cliente1);

    System.out.println(miLista.get(0).nombre); //This displays "Alberto1"
    System.out.println(miIterador.hasNext()); //This displays 'true'
    miIterador.next(); //Here I get the exception

我不知道如何解决它。这可能是一个愚蠢的问题,因为实际上我是初学者,但我被困在这里。

谢谢。

- 甚至不能回答我自己的问题,所以我用答案编辑问题:

非常感谢你们所有人!你们都给了我正确的答案:D对不起那个愚蠢的问题:P

解决

5 个答案:

答案 0 :(得分:4)

这条线是罪魁祸首。除非通过迭代器自己的remove或add方法,否则在以任何方式获取迭代器后都无法修改列表。

miLista.add(cliente1);
  

ArrayList类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException

答案 1 :(得分:3)

  

“但我认为我的问题有点不同,因为我是   即使使用Iterator方法也不会修改ArrayList。“

但是你要通过添加一个元素来修改列表:)

    ArrayList<Cliente> miLista = new ArrayList<Cliente>();

    Iterator<Cliente> miIterador = miLista.iterator();

    miLista.add(cliente1); 
    ^^^^^^^^^^^^^^^^^^^^^^ here!

答案 2 :(得分:1)

这是有问题的一行,你通过添加对象来修饰arraylist。 Iterator是在真实数组列表上创建的,所以它会以异常快速的方式抛出异常。

miLista.add(cliente1);

这是来自arrayList类的一段代码 在迭代器上调用getNext时会触发它。

 final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }

答案 3 :(得分:0)

您在生成Iterator后修改列表。只需交换行

Iterator<Cliente> miIterador = miLista.iterator();

miLista.add(cliente1);

一切都会正常。

答案 4 :(得分:0)

另一种方法是使用ListIterator代替并在插入新客户端后重绕迭代器

    Cliente cliente1 = new Cliente(16096,"Alberto1","pass",1500.0,false);

    ArrayList<Cliente> miLista = new ArrayList<Cliente>();

    ListIterator<Cliente> miIterador = miLista.listIterator();

    miIterador.add(cliente1);
    miIterador.previous();

    System.out.println(miLista.get(0).getHombre()); //This displays "Alberto1" << notice you're not using the iterator here
    System.out.println(miIterador.hasNext()); //This displays 'true'
    System.out.println(miIterador.next().getHombre()); //This displays "Albert1" again