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
相关产品推荐
相关产品推荐

