从Object的Collection / Changing字段中删除Item

时间:2014-05-30 09:07:51

标签: java arraylist concurrentmodification

public void searchOwner(List<Appointments> appts, String owner) {
    Appointments theOne = null;
    for (Appointments temp : appts) {
        if (owner.equalsIgnoreCase(temp.owner.name)) {
            System.out.println(temp.data);
            temp.setResolved(true);
        }
    }
}

public void checkRemoval() {
    for (Appointments appts : appointments) {
        if (appts.resolved == true) {
            appointments.remove(appts);
        }

//Iterator method used before enhanced for-loop
    public void checkRemovalI(){
    Iterator<Appointments> it = appointments.iterator();
    while(it.hasNext()){
        if(it.next().resolved = true){
            it.remove();
        }
    }
}

到目前为止,这是我遇到问题的地方。我试图检查约会的arrayList并查看字段(已解决)是否设置为true,但是在尝试将resolved =设置为true时,我在searchOwner方法期间收到ConcurrentModification异常。我已经尝试在checkRemoval中使用Iterator而不是增强的for循环,但这也没有帮助。我真的只需要将约会设置为true的部分工作,checkRemoval似乎在实现更改布尔值解析之前就已经工作了。非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

我愿意打赌,ConcurrentModificationException不会在你说的地方引起,而是在checkRemoval(),你可能在你提到的那一行之前调用resolved { {1}}为真,因此你的困惑。

我只是这样说是因为:

for (Appointments appts : appointments) {
    if (appts.resolved == true) {
        appointments.remove(appts);
    }
}

是一种明显的并发修改。 当您在循环中迭代它时,无法从集合中删除元素。相反,您需要使用iterator

public void checkRemoval() {
    Iterator<Appointment> apptsIterator = appointments.iterator();
    while (apptsIterator.hasNext()){ 
        if (appts.next().resolved == true) 
            apptsIterator.remove(); //removes the last element you got via next()
    }

答案 1 :(得分:1)

使用for循环抛出ConcurrentModification异常,其中Collection被修改。所以问题不一定是你发布的代码。你可能在appts List上有一个循环,它正在调用这个函数。 发布更多代码可能有所帮助。