嵌套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; } } }
排查建议
- 在「单词移除」方法中添加日志,打印每次循环的索引、当前单词、检查的字符,定位程序退出的具体位置。
- 给循环代码包裹
try-catch块,捕获并打印异常信息:
try { // 你的移除逻辑代码 } catch (Exception e) { e.printStackTrace(); }
- 检查方法内是否有
return、System.exit()等提前终止程序的语句。
内容的提问来源于stack exchange,提问作者dappy9
相关产品推荐
相关产品推荐

