System.arraycopy不提供容错,而是严格校验后立即报错:srcPos≥0且srcPos+length≤src.length、destPos≥0且destPos+length≤dest.length、length≥0,任一不满足即抛ArrayIndexOutOfBoundsException;null或类型不兼容时提前抛NullPointerException或ArrayStoreException;length=0合法且用于预检;重叠拷贝时JVM自动选择安全顺序。

System.arraycopy 的边界处理不是“容错机制”,而是严格校验+立即报错。它不尝试修复、截断或静默跳过,只要参数越界或类型不匹配,就立刻抛异常——这是它高效可控的底层前提。
越界检查的硬性规则
以下任一条件不满足,当场抛 ArrayIndexOutOfBoundsException,目标数组内容不变:
- srcPos
- length
- srcPos + length > src.length(注意:是“大于”,等于刚好合法)
- destPos + length > dest.length(同理,“等于”是允许的临界值)
例如:System.arraycopy(arr, 5, arr, 3, 3) —— 若 arr 长度为 8,则 5+3=8 ≤ 8 ✅,3+3=6 ≤ 8 ✅,合法;但若长度为 7,则 5+3=8 > 7 ❌,直接崩溃。
null 和类型兼容的即时拦截
两类错误在搬运前就终止执行,且不修改目标数组:
- src == null 或 dest == null → 抛 NullPointerException
- src 和 dest 组件类型不兼容 → 抛 ArrayStoreException:
• int[] 不能拷到 long[],哪怕 length=0 也不行
• String[] 可以拷到 Object[](子类→父类)
• Object[] 不可拷到 String[](父类→子类,运行时报错)
length = 0 是合法且安全的操作
传入 length == 0 不做任何内存搬运,但仍会完整执行全部边界与类型校验:
- 可用于快速预检:先用 length=0 调用,确认不抛异常,再真正搬运
- srcPos 和 destPos 可为任意合法索引(如 srcPos = src.length,此时 0 元素从末尾“空位”开始读,不越界)
- 常见于防御性封装中,避免重复写校验逻辑
重叠区域的自动安全顺序
当 src == dest 且区间重叠时,arraycopy 不依赖用户判断方向,而是由 JVM 内部按需选择正向或倒序执行:
- destPos > srcPos(右移)→ 自动倒序搬运,防止覆盖未读数据
- destPos
- 即使 srcPos == destPos(原地拷贝),只要 length > 0,也等效于“无操作”(内容不变),不会报错
注意:这种自动处理仅适用于同一数组内的重叠;跨数组重叠(src ≠ dest)不触发该逻辑,仅做普通搬运,是否覆盖由你控制。

















