You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:29:15