gpt4 book ai didi

java - 带有迭代器的 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-12-03 07:31:51 24 4
gpt4 key购买 nike

在 DTO 中我有

public class ProductTypesDto extends BaseDto {
private List<Integer> colors = new ArrayList<>();
...
}

在我的 bean 里

@Entity
public class ProductTypes
@ManyToMany
private Set<Colors> colors = new HashSet<>();
...
}

用户可以添加和删除productTypes的颜色

在 DTO 到 bean 的转换中,我这样做

private void convertToBeans(ProductTypesDto dto, ProductTypes beans) {
//add element
for (Integer color : dto.getColors()) {
if (beans.getColors().stream().noneMatch(e -> Objects.equals(e.getId(), color))) {
Optional<Colors> optColors = colorsRepository.findById(color);
if (optColors.isPresent()) {
beans.addColor(optColors.get());
}
}
}
//remove element
for (Iterator<Colors> iterator = beans.getColors().iterator(); iterator.hasNext();) {
Colors color = iterator.next();

if (dto.getColors().stream().noneMatch(e -> e.intValue() == color.getId())) {

Optional<Colors> optColors = colorsRepository.findById(color.getId());
if (optColors.isPresent()) {
beans.removeColor(optColors.get());
}

}
}
}

当代码运行时,我得到

java.util.ConcurrentModificationException: null

似乎在 iterator.next(); 上得到这个

最佳答案

您无法迭代 beans.getColors() 集合并通过调用 beans.removeColor() 从中删除,这很可能执行 colors.remove ().

要从底层集合中删除当前遍历的元素,请使用 Iterator.remove()方法例如替换:

beans.removeColor(optColors.get());

与:

iterator.remove();

关于java - 带有迭代器的 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51315184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com