数组拷贝越界异常的根本原因是参数脱离数组实际容量约束,System.arraycopy()等方法不自动校验参数合理性,仅按传入数值执行内存偏移,srcPos、destPos或length任一越界即抛ArrayIndexOutOfBoundsException。

数组拷贝中出现的越界异常,根本原因不是“复制动作本身出错”,而是拷贝操作所依赖的索引、长度或边界参数脱离了目标数组或源数组的实际容量约束。
拷贝方法的参数必须严格匹配数组真实边界
Java 中像 System.arraycopy()、Arrays.copyOf() 这类方法,内部不自动校验逻辑合理性,只按你传入的数值执行内存偏移。一旦任一参数越界,就直接触发 ArrayIndexOutOfBoundsException:
- srcPos(源起始位置) 小于 0 或 ≥ 源数组长度 → 越界
- destPos(目标起始位置) 小于 0 或 ≥ 目标数组长度 → 越界
- length(拷贝元素个数) 为负数,或导致 srcPos + length > 源数组长度,或 destPos + length > 目标数组长度 → 全部越界
常见误用场景还原
这些写法看着合理,实则埋着越界雷:
- 把
arraycopy(arr, 0, newArr, 0, arr.length + 1)当成“多拷一个保险”——+1 就越界 - 用
Arrays.copyOf(arr, arr.length * 2)扩容后,又拿原arr.length去遍历新数组——新数组下标上限是arr.length * 2 - 1,但循环仍只到arr.length - 1,看似安全,实际若后续代码误用新数组长度却没更新变量,就会出问题 - 多维数组拷贝时只检查外层数组长度,忽略内层如
matrix[0].length可能为 0 或不一致,调用arraycopy(matrix[i], 0, rowCopy, 0, matrix[i].length)前未判空或校验,运行时崩在某一行
真正安全的拷贝习惯
不靠运气,靠显式防御:
- 所有拷贝前先断言:源数组非 null、目标数组非 null、各位置参数 ≥ 0、各长度参数 ≤ 对应数组可用空间
- 用
Math.min()控制实际拷贝量,例如:int copyLen = Math.min(src.length - srcPos, dest.length - destPos); - 避免硬编码数字,优先用
arr.length及其衍生表达式,并确保该表达式与当前上下文数组严格对应 - 对用户输入或外部传入的索引/长度,必须做前置校验,不能假设“调用方会守规矩”
越界不是数组的错,是参数失控的结果。盯住每一个数字从哪来、它代表什么、它是否还在合法区间里——这才是拷贝不出错的关键。

















