简体   繁体   English

即使使用迭代器,也获得并发修改异常

[英]Getting concurrent modification exception even after using iterator

Consider the following code: 考虑以下代码:

 if(!unmatchedNewTruckRequirementSet.isEmpty()){
        for(Iterator<TruckRequirement> iterator = unmatchedNewTruckRequirementSet.iterator(); iterator.hasNext();){
            TruckRequirement newTruckRequirement = iterator.next();
            for(Iterator<TruckRequirement> iterator1 = oldTruckRequirementSet.iterator(); iterator1.hasNext();){
                TruckRequirement oldTruckRequirement1 = iterator1.next();
                if(oldTruckRequirement1.getTruckClassName().equals(newTruckRequirement.getTruckClassName())) {
                    LogUtil.logInfo("Truck Requirement Changed ", "Truck Requirement Changed : From : {0} to {1} where Truck Class is: {2}",
                            new Object[]{oldTruckRequirement1.getNumberOfTrucks(), newTruckRequirement.getNumberOfTrucks(), newTruckRequirement.getTruckClassName()});
                    unmatchedNewTruckRequirementSet.remove(newTruckRequirement);
                }
            }LogUtil.logInfo("Truck Requirement Added ", "New Truck Requirement Added with Truck Class : {0} and number of Trucks : {1}",
                    new Object[]{newTruckRequirement.getTruckClassName(), newTruckRequirement.getNumberOfTrucks()});

    }else {
        if(oldTruckRequirementSet.size() > unmatchedNewTruckRequirementSet.size()){
            for(TruckRequirement truckRequirement : oldTruckRequirementSet) {
                LogUtil.logInfo("Truck Requirement Removed ", "Truck Requirement Removed with Truck Class : {0}",
                        new Object[]{truckRequirement.getTruckClassName()});
            }
        }
    }

I have used iterator to iterate over the two hashset: unmatchedNewTruckRequiremnetSet and the other one is oldTruckRequirementSet . 我已经使用迭代器遍历两个HashSet的: unmatchedNewTruckRequiremnetSet ,另一种是oldTruckRequirementSet When I try to remove a set from unmatchedNewTruckRequiremnetSet I get Concurrent modification exception. 当我尝试从unmatchedNewTruckRequiremnetSet删除一个集合时,出现并发修改异常。 Please help. 请帮忙。

You will get ConcurrentModificationException if you use Collection.remove or add method while looping. 如果在循环时使用Collection.removeadd方法,则将获得ConcurrentModificationException

You must use Iterator.remove() to remove and avoid the exception. 您必须使用Iterator.remove()删除并避免该异常。

for(Iterator<TruckRequirement> iterator1 = oldTruckRequirementSet.iterator(); iterator1.hasNext();){
    TruckRequirement oldTruckRequirement1 = iterator1.next();
    if(oldTruckRequirement1.getTruckClassName().equals(newTruckRequirement.getTruckClassName())) {
        LogUtil.logInfo("Truck Requirement Changed ", 
                "Truck Requirement Changed : From : {0} to {1} where Truck Class is: {2}",
                new Object[]{oldTruckRequirement1.getNumberOfTrucks(), 
                newTruckRequirement.getNumberOfTrucks(), newTruckRequirement.getTruckClassName()});

        // Use the iterator to remove
        iterator1.remove();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM