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

嵌套for循环致Java List元素异常移除,程序提前退出问题排查

问题:嵌套循环移除ArrayList元素时程序提前退出

我尝试用嵌套for循环从字符串ArrayList arr2 中移除包含字符ArrayList arr1 内任意字符的单词,但程序进入「单词移除」方法后直接以退出码0结束,无法执行后续的打印逻辑。已确认arr1和arr2初始化正确(测试时能正常打印),也重写过循环逻辑,但问题依旧。

问题代码

// 原嵌套循环代码
for (int i = 0; i < arr2.size(); i++) {
    String currentWord = arr2.get(i);
    for (char targetChar : arr1) {
        if (currentWord.contains(String.valueOf(targetChar))) {
            arr2.remove(i);
        }
    }
}

程序完整输出

初始化arr1: [x, y, z]
初始化arr2: [xyz, apple, yellow, lemon]
进入单词移除方法...
Process finished with exit code 0

可能的问题原因

  • 遍历期间修改ArrayList导致的索引异常:用普通正序for循环遍历arr2时,调用remove(i)会让后续元素前移,导致索引跳过部分元素,甚至触发数组越界异常(若未捕获,程序会直接退出)。
  • 方法内存在提前退出逻辑:检查「单词移除」方法中是否有return或System.exit(0)语句,导致执行到移除操作后直接终止方法/程序。
  • 未捕获的隐性异常:比如arr1或arr2中存在null元素,调用contains或get时触发异常,但未添加异常捕获,程序静默退出。

解决方案

方案1:使用迭代器(安全遍历+修改)

迭代器是ArrayList遍历并修改的标准安全方式,能避免索引错乱问题:

Iterator<String> iter = arr2.iterator();
while (iter.hasNext()) {
    String word = iter.next();
    for (char c : arr1) {
        if (word.contains(String.valueOf(c))) {
            iter.remove(); // 安全移除当前元素
            break; // 找到匹配字符后跳出内层循环,避免重复处理
        }
    }
}

方案2:倒序for循环

倒序遍历可以避开元素前移导致的索引跳过问题:

// 从最后一个元素往前遍历
for (int i = arr2.size() - 1; i >= 0; i--) {
    String word = arr2.get(i);
    for (char c : arr1) {
        if (word.contains(String.valueOf(c))) {
            arr2.remove(i);
            break;
        }
    }
}

排查建议

  1. 在「单词移除」方法中添加日志,打印每次循环的索引、当前单词、检查的字符,定位程序退出的具体位置。
  2. 给循环代码包裹try-catch块,捕获并打印异常信息:
try {
    // 你的移除逻辑代码
} catch (Exception e) {
    e.printStackTrace();
}
  1. 检查方法内是否有return、System.exit()等提前终止程序的语句。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:43:10