我正在遭遇这个例外.我的代码有什么问题?
我只想在另一个ArrayList中分离Person的重复名称
我只想在另一个ArrayList中分离Person的重复名称
public class GlennTestMain { static ArrayList<Person> ps; static ArrayList<Person> duplicates; public static void main(String[] args) { ps = new ArrayList<GlennTestMain.Person>(); duplicates = new ArrayList<GlennTestMain.Person>(); noDuplicate(new Person("Glenn",123)); noDuplicate(new Person("Glenn",423)); noDuplicate(new Person("Joe",1423)); // error here System.out.println(ps.size()); System.out.println(duplicates.size()); } public static void noDuplicate(Person p1) { if(ps.size() != 0) { for(Person p : ps) { if(p.name.equals(p1.name)) { duplicates.add(p1); } else { ps.add(p1); } } } else { ps.add(p1); } } static class Person { public Person(String n,int num) { this.name = n; this.age = num; } String name; int age; } }
这是堆栈跟踪
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at hk.com.GlennTestMain.noDuplicate(GlennTestMain.java:41) at hk.com.GlennTestMain.main(GlennTestMain.java:30)
解决方法
您无法修改正在迭代的集合.这可能会抛出ConcurrentModificationException.虽然它有时会起作用,但并不能保证每次都能正常工作.
如果要添加或删除列表中的内容,则需要使用Iterator或ListIterator作为列表.并使用ListIterator#add
方法在列表中添加任何内容.即使在你的迭代器中,如果你尝试使用List.add或List.remove,你也会得到那个例外,因为这没有任何区别.您应该使用迭代器的方法.
请参阅这些帖子以了解如何使用它: –
> Java : ConcurrentModificationException while iterating over list
> Iterating through a Collection,avoiding ConcurrentModificationException when removing in loop