HashMap 中的 ConcurrentModificationException
ConcurrentModificationException in HashMap
我正在从用户那里获取保险详细信息并将它们保存在哈希图中。
我有一个名为 SAVE 的按钮。因此,仅当用户单击此按钮时,所有保险都应保存在数据库中
所以我将随机生成的 ID 作为参考,直到我将详细信息保存在数据库中
保存在数据库中后,我需要使用密钥作为自动生成的 id
更新此哈希图
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
来存储更新后的值,并使用 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);
作为一种可能的解决方案
我正在从用户那里获取保险详细信息并将它们保存在哈希图中。 我有一个名为 SAVE 的按钮。因此,仅当用户单击此按钮时,所有保险都应保存在数据库中 所以我将随机生成的 ID 作为参考,直到我将详细信息保存在数据库中 保存在数据库中后,我需要使用密钥作为自动生成的 id
更新此哈希图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
来存储更新后的值,并使用 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);
作为一种可能的解决方案