【发布时间】:2021-04-27 09:41:12
【问题描述】:
在生产环境中运行以下代码时出现 ConcurrentModificationException。该问题似乎是间歇性的(当我尝试调用使用以下代码的 api 时,它工作正常)。
我检查了类似的问题,但在每个问题中,有人会遍历一个列表并同时对其进行修改。我不确定以下代码有什么问题以及为什么会引发异常。任何指针都非常感谢。
谢谢。
private String getLookupKeyForODPair () {
final List<LookUpKey> lookUpKeyList = transitTimeConfiguration.getLookUpKeys();
// Build lookUpKey
final String lookUpKey = buildLookupKey(lookUpKeyList, originDestinationPair, merchantId);
// perform operations on lookupKey and not on lookupKeyList
}
private String buildLookupKey(final List<LookUpKey> lookUpKeyList,
final ODPair odPair,
final String id) {
lookUpKeyList.sort(Comparator.comparing(LookUpKey::getOrder));
final List<String> keyList = new ArrayList<>();
lookUpKeyList.forEach(key -> {
switch (key.getName()) {
case Constants.ID:
keyList.add(id);
break;
case Constants.ZIP_CODE:
keyList.add(odPair.zipCode);
break;
case Constants.COUNTRY_CODE:
keyList.add(odPair.countryCode);
break;
default:
}
});
return String.join(MiscellaneousConstants.COMMA, keyList);
}
堆栈跟踪
Caused by: java.util.ConcurrentModificationException
at java.util.ArrayList.forEach(ArrayList.java:1262) ~[?:1.8.0_282]
at com.placing.lookupKeyService.component.impl.LookupKeyComponentImpl.buildLookupKey(LookupKeyComponentImpl.java:410) ~[LookupKeyService-1.0.jar:?]
at com.placing.lookupKeyService.component.impl.LookupKeyComponentImpl.getLookupKeyForODPair(LookupKeyComponentImpl.java:221) ~[LookupKeyService-1.0.jar:?]
at com.placing.lookupKeyService.component.impl.LookupKeyComponentImpl.lambda$null$4(LookupKeyComponentImpl.java:196) ~[LookupKeyService-1.0.jar:?]
at java.lang.Iterable.forEach(Iterable.java:75) ~[?:1.8.0_282]
at com.placing.lookupKeyService.component.impl.LookupKeyComponentImpl.lambda$getLookupKeyForAllConfigurations$5(LookupKeyComponentImpl.java:196) ~[LookupKeyService-1.0.jar:?]
at java.util.ArrayList.forEach(ArrayList.java:1259) ~[?:1.8.0_282]
at com.placing.lookupKeyService.component.impl.LookupKeyComponentImpl.getLookupKeyForAllConfigurations(LookupKeyComponentImpl.java:185) ~[LookupKeyService-1.0.jar:?]
at com.placing.lookupKeyService.component.impl.LookupKeyComponentImpl.lambda$getAllLookupKeys$2(LookupKeyComponentImpl.java:160) ~[LookupKeyService-1.0.jar:?]
【问题讨论】:
-
堆栈跟踪可以帮助识别问题……除此之外,临时的
ArrayList是不必要的。您可以使用 Stream 操作来映射值并将它们首先连接到字符串。此外,它允许在不修改传入的lookUpKeyList的情况下对流元素进行排序。
标签: java exception arraylist concurrency