Java从Set移除元素引发IllegalStateException,请问问题出在哪里?
为何迭代HashSet时移除元素触发了IllegalStateException?
兄弟,我瞅了你的代码,问题根源很明确:你在调用iterator.remove()之前,没有先调用iterator.next()方法!
问题原因详解
Java里集合的迭代器(比如HashSet的迭代器)有个严格的规则:remove()方法只能在刚刚通过next()获取到当前元素之后调用。如果跳过next()直接调用remove(),迭代器会认为你没有定位到合法的元素位置,直接抛出IllegalStateException。
看你的循环逻辑:
- 第一次循环:
count是0,循环条件hasNext()为true,但你没调用next(),直接让count变成1; - 第二次循环:
hasNext()依然为true,此时count==1,你直接调用remove()——但这时候迭代器根本没通过next()定位到任何元素,自然触发异常。
另外还要提一句:HashSet是无序集合,它不保证元素的存储顺序和插入顺序一致,所以你想移除的“第二个元素”其实是不确定的。如果需要按插入顺序操作,建议换成LinkedHashSet。
修正后的代码
只需要在判断之前先调用next()获取元素,让迭代器定位到当前元素位置即可:
HashSet<String> set = new HashSet<>(); set.add("123"); set.add("qwe"); set.add("asd"); int count = 0; for (Iterator<String> iterator = set.iterator(); iterator.hasNext();) { String currentElement = iterator.next(); // 先调用next()定位元素 if (count == 1) { iterator.remove(); // 现在调用remove()就合法了 } count++; }
内容的提问来源于stack exchange,提问作者PolYarBear
相关产品推荐
相关产品推荐

