我在以下代码中抛出ConcurrentModificationExample。我检查了API,它与我一起尝试修改一个对象,而另一个线程正在迭代它。我对此事毫无头绪。我在导致异常的行上方创建了一条注释。 Employee类不包含除存储信息的三个变量之外的任何内容。
我将包括整个类,因为我还想知道是否有一种简化代码的方法,因为它重复了许多事情,例如创建对象并将所有内容添加到列表中。
答案 0 :(得分:0)
您尝试做的事情与此类似......
List list = ...;
for(item: list) {
list.add(item);
}
也就是说,您通过迭代同一个集合来更新包含元素的集合。所有
outputList.add(...);
部门的正在从同一个集合' employees'中添加元素。 在main()中,通过执行
dep.employeesByAge(dep.employees)
您正试图更新' dep.employees'与' dep.employees。'这会导致并发修改异常。
答案 1 :(得分:0)
当您使用dep.employees:
在此处调用employeesByAge时dep.employeesByAge(dep.employees)
将dep.employees传递给employeesByAge,以便:
public class Department{
LinkedList<Employee> employees = ...;
public LinkedList<Employee> employeesByAge(LinkedList<Employee> outputList) {
...
}
}
employee成员字段和outputList参数都引用相同的列表,而不仅仅是具有相同内容但具有相同列表实例的两个列表。
然后你做:
for (Employee emp: employees){
//the list is null. add the first employee
if (outputList.isEmpty()){
outputList.add(emp);
} else
...
}
迭代员工并修改outputList,但请记住这两个是相同的列表对象。因此,ConcurrentModificationException。