我正在遭遇这个例外。我的代码有什么问题?
我只想在另一个ArrayList
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;
}
}
这是stacktrace
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)
答案 0 :(得分:13)
您无法修改正在迭代的collection
。这可能会引发ConcurrentModificationException
。虽然它有时会起作用,但并不能保证每次都能正常工作。
如果您要在列表中添加或删除某些内容,则需要使用Iterator
或ListIterator
作为列表。并使用ListIterator#add
方法在列表中添加任何内容。即使在iterator
中,如果您尝试使用List.add
或List.remove
,您也会获得该异常,因为这没有任何区别。您应该使用iterator
。
请参阅这些帖子以了解如何使用它: -
答案 1 :(得分:4)
ArrayList返回的迭代器性质为fail-fast
。
此类的迭代器和
listIterator
方法返回的迭代器是fail-fas
t:如果在创建迭代器之后的任何时候对列表进行结构修改,除非通过迭代器自己的删除或添加方法,迭代器将抛出ConcurrentModificationException
。因此,面对并发修改,迭代器会快速而干净地失败,而不是在未来不确定的时间冒着任意的,非确定性行为的风险。
对于集合的增强for循环,Iterator
会被使用,因此在迭代时无法调用add
方法。
所以你的循环与下面相同
for (Iterator<Entry> i = c.iterator(); i.hasNext(); ){
您可以调用iterator.add();
并基于迭代器显式而不是隐式地更改循环。
String inputWord = "john";
ArrayList<String> wordlist = new ArrayList<String>();
wordlist.add("rambo");
wordlist.add("john");
for (ListIterator<String> iterator = wordlist.listIterator(); iterator
.hasNext();) {
String z = iterator.next();
if (z.equals(inputWord)) {
iterator.add("3");
}
}
System.out.println(wordlist.size());
答案 2 :(得分:0)
度Acc。到Java Docs:
如果线程在使用失败快速迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。
您正在使用Enhanced For loop进行迭代时添加Person
对象。
您可以进行以下修改:
boolean duplicateFound = false;
for(Person p : ps)
{
if(p.name.equals(p1.name))
{
duplicates.add(p1);
duplicateFound = true;
}
}
if( ! duplicateFound)
{
ps.add(p1);
}