Java给定Solution类运行抛出java.lang.ArrayIndexOutOfBoundsException错误
Java duplicateZeros方法数组越界问题修复方案
这段代码抛出java.lang.ArrayIndexOutOfBoundsException的核心原因是内层循环访问了超出数组范围的下标,具体问题和修复方案如下:
错误原因
- 内层循环数组访问越界:内层循环初始
j = arr.length - 1,执行arr[j] = arr[j+1]时,j+1等于arr.length,超出了数组下标最大范围arr.length - 1,直接触发越界异常。 - 移位逻辑错误:原代码的移位操作是将元素左移,和需求的「将i之后的元素右移一位,空出i+1位置放重复的0」完全相反,就算解决越界问题也无法实现预期功能。
- 索引步进错误:没有对i额外加1,遇到0并完成复制后,下一次循环会遍历到新复制的0,导致重复复制,最终数组会被填充为全0。
- 多余的边界判断:
if (i!=arr.length)完全冗余,外层循环i < arr.length -1已经保证了i最大为arr.length - 2,i+1不会越界。
修复后代码
class Solution { public void duplicateZeros(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { if (arr[i] == 0) { // 从后往前将i之后的元素右移一位 for (int j = arr.length - 1; j > i; j--) { arr[j] = arr[j - 1]; } // 跳过已经复制的0,避免重复处理 i++; } } } }
修复说明
- 修正了移位逻辑:将
arr[j] = arr[j+1]改为arr[j] = arr[j-1],实现元素右移,同时从根源避免数组越界。 - 增加i的额外步进:完成0的复制后i加1,跳过新复制的0,避免重复处理。
- 移除冗余的边界判断,简化代码逻辑。
- 外层循环保留
i < arr.length - 1的限制,避免遍历到数组最后一位时无空位存放重复0的无效处理。
内容的提问来源于stack exchange,提问作者Abhishek Khaiwale
相关产品推荐
相关产品推荐

