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

Java使用Iterator移除ArrayList字符串元素报IllegalStateException如何解决

异常产生原因

你遇到的java.lang.IllegalStateException是Iterator删除操作的调用规范不满足导致的,结合你的代码具体有两个触发点:

  • Iterator的remove()方法有严格的调用约束:必须在调用next()方法获取到当前迭代元素之后才能调用,且每调用一次next(),最多只能调用一次remove()。如果在同一个迭代位置重复调用remove(),或者还没调用next()就调用remove(),就会直接抛出这个异常。你的代码在内层遍历字符串字符的for循环中,只要检测到符合条件的字符就立刻调用it.remove(),如果一个字符串里包含多个非字母字符,就会对同一个迭代元素重复触发多次删除,第二次删除时就会触发异常。
  • 你的字符判断逻辑存在笔误:!Character.isLetter(c)传入的参数是循环下标c,不是字符串对应位置的字符i.charAt(c),实际判断的是下标数值本身是否为字母对应的Unicode编码,完全偏离了检测字符串内容的预期,会触发大量无意义的删除操作,进一步提升异常触发概率。
修复方案
  • 调整删除触发逻辑:遍历单个字符串的字符时,先用布尔值标记当前字符串是否包含非字母字符,等整个字符串检查完成后,若确实符合删除条件,仅调用一次it.remove(),避免重复调用。
  • 修正字符检测的参数错误,给Character.isLetter()传入对应位置的字符而非循环下标。
  • 检测到当前字符串存在非字母字符时可以直接跳出内层循环,不需要继续遍历剩余字符,减少无意义的性能消耗。
修正后的核心代码

对应你原代码中d部分的遍历删除逻辑,修正后代码如下:

// d) 移除包含非字母字符的字符串元素
Iterator<String> it = two.iterator();
while(it.hasNext()){
    String currentStr = it.next();
    boolean needRemove = false;
    for (int idx = 0; idx < currentStr.length(); idx++){
        // 传入对应位置的字符做判断
        if (!Character.isLetter(currentStr.charAt(idx))){ 
            needRemove = true;
            // 已确认需要删除,无需继续遍历剩余字符
            break;
        }
    }
    // 确认符合删除条件,仅执行一次删除操作
    if (needRemove) {
        it.remove();
    }
}

内容的提问来源于stack exchange,提问作者EliunKKy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 01:36:32