【问题标题】:ConcurrentModificationException in HashMapHashMap 中的 ConcurrentModificationException
【发布时间】:2015-09-23 04:23:52
【问题描述】:

我从用户那里获取保险详细信息并将它们保存在哈希图中。 我有一个叫做保存的按钮。因此,只有当用户单击此按钮时,所有保险都应保存在数据库中 所以我将随机生成的 id 作为参考,直到我将详细信息保存在数据库中 保存到数据库后,我需要使用键作为自动生成的 id 来更新这个 hashmap

public void saveInformationInDatabase(int patientId)
{
    // getAllInsurances returns HashMapn<Integer, HashMap<Integer, InsuranceInformation>>
    Iterator<Map.Entry<Integer, InsuranceInformation>> insurances = getAllInsurances().get(patientId).entrySet().iterator();
    while(insurances.hasNext())
    {
        InsuranceInformation insuranceInformation = insurances.next().getValue();
        if (insuranceInformation.getStatus() == Status.OLD)
            continue;
        else if (insuranceInformation.getStatus() == Status.NEW)
        {
            // Saving the Information in database, and returning auto generated ID
            int licId = saveInformation(insuranceInformation);
            // So, i need to update insuranceInformation with autogenerated ID
            // Because previous id is randomly generated number
            insuranceInformation.setLicID(licId);
            insuranceInformation.setStatus(InsuranceObject.Status.OLD);
            // Below line gives me ConcurrentModificationException
            getAllInsurances().get(patientId).put(licId, insuranceInformation); // Storing the updated information with newly generated id as key, in hashmap
            insurances.remove(); // and here, removing the old hashmap entry
        }
    }
}

【问题讨论】:

  • 有什么问题?这段代码是否在外循环中?
  • 这个getAllInsurances().get(patientId).put(licId, insuranceInformation);会给你带来麻烦。使用临时的Map 存储新值,然后使用Map#putAll 同步回原始值
  • @MadProgrammer 非常感谢。现在,如果我使用第二个 Hashmap,它可以正常工作

标签: java iterator hashmap concurrentmodification


【解决方案1】:

getAllInsurances().get(patientId).put(licId, insuranceInformation); 在您尝试迭代时更新 Map,这会导致异常,因为您在迭代时无法修改集合。

相反,您应该使用第二个Map 来存储更新的值并使用Map#putAll 重新同步这两个值,例如...

// Test map full of values...
Map<Integer, String> mapTest = new HashMap<>(25);
for (int index = 0; index < 10; index++) {
    mapTest.put(index, Integer.toString(index));
}

// Grab an iterator
Iterator<Map.Entry<Integer, String>> insurances = mapTest.entrySet().iterator();
// Create a temp map for the new values
Map<Integer, String> newValues = new HashMap<>(25);
while(insurances.hasNext()) {

    Map.Entry<Integer, String> entry = insurances.next();
    int key = entry.getKey();
    // Make the comparison about what we want to do, here
    // we're removing even keys
    if (key % 2 == 0) {
        // Remove the old entry
        insurances.remove();
        // Use the temp map to create a new entry
        newValues.put(key * 10, entry.getValue());
    }

}

// Merge the results
mapTest.putAll(newValues);

作为一种可能的解决方案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多