我有像
这样的for循环 for (int neighbour : neighbours) {
我可以在循环中修改neighbours
。发现这就是ConcurrentModificationException
的原因。并阅读https://stackoverflow.com/a/8189527/292291
因此,如果您想修改列表(或一般的任何集合), 使用迭代器,因为它知道修改因此 这些将得到妥善处理。
所以我试过了:
neighboursItr = neighbours.iterator();
while (neighboursItr.hasNext()) {
// try disconnecting vertices
neighbour = neighboursItr.next();
但这并不能解决问题。为什么呢?
答案 0 :(得分:8)
你打电话给neightbours.remove(neighbour)
吗?在那种情况下,这就是问题所在。您需要拨打neightboursItr.remove()
。
答案 1 :(得分:1)
您是否考虑过创建具有所需状态的新HashSet
?我的意思是你可以遍历neighbours
并添加到newNeighbours
你想要的任何内容。
答案 2 :(得分:1)
您只能在迭代集合时修改集合使用迭代器的方法。因此,您可以致电neighboursItr.remove()
,但例如,您可能无法使用neighbours.add()
向集合中添加元素。
答案 3 :(得分:1)
迭代时无法修改集合。唯一的例外是使用iterator.remove()
方法(如果目标集合支持它)。
原因是这就是迭代器的工作原理。它必须知道如何跳转到集合的下一个元素。如果在创建迭代器后更改集合,则无法执行此操作并抛出异常。
这个问题有几种解决方案。例如,如果要在迭代期间向现有集合添加元素,则可以创建另一个集合,在该集合中存储新元素,然后在迭代完成后添加所有这些元素。