迭代列表时使用Iterator移除元素抛出异常求助
解决Iterator遍历移除元素触发异常的问题
嘿,我来帮你搞定这个问题!这种异常大概率是ConcurrentModificationException,最常见的原因就是你在迭代过程中直接调用了列表本身的remove()方法,而不是用Iterator自带的remove()。
错误示例(会触发异常)
比如你可能写了这样的代码:
List<String> myList = new ArrayList<>(Arrays.asList("apple", "banana", "cherry")); Iterator<String> it = myList.iterator(); while (it.hasNext()) { String element = it.next(); if (element.equals("banana")) { myList.remove(element); // 这里错了!直接操作列表本身 } }
为什么会报错?因为Iterator内部维护了一个和集合同步的修改计数器,当你直接调用集合的remove()时,计数器就不一致了,Iterator就会抛出异常来提醒你并发修改的问题。
正确的写法(用Iterator的remove())
把上面的代码改成用Iterator自带的remove()方法就没问题了:
List<String> myList = new ArrayList<>(Arrays.asList("apple", "banana", "cherry")); Iterator<String> it = myList.iterator(); while (it.hasNext()) { String element = it.next(); if (element.equals("banana")) { it.remove(); // 用迭代器的remove方法,安全移除当前元素 } }
这个方法会在移除元素的同时,同步更新Iterator内部的计数器,不会触发异常。
还要注意两个坑
- 调用remove()前必须先调用next():如果还没调用
next()就直接调用it.remove(),会抛出IllegalStateException,因为Iterator不知道要移除哪个元素。 - 每次next()只能调用一次remove():同一个元素不能连续调用两次
it.remove(),同样会触发IllegalStateException。
如果你的代码已经用了Iterator的remove()还是报错,可以把你的代码片段贴出来,我再帮你仔细排查~
内容的提问来源于stack exchange,提问作者user3213490
相关产品推荐
相关产品推荐

