我正在尝试使用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
解决
答案 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