数组复制异常主要包括arrayindexoutofboundsexception、nullpointerexception和arraystoreexception,分别由目标数组长度不足、源或目标数组为null、类型不匹配引起,需通过参数校验与类型一致保障安全。

数组复制操作中常见的异常主要是 ArrayIndexOutOfBoundsException 和 NullPointerException,它们不是偶然出现的“运气问题”,而是由明确的逻辑错误触发的。关键在于理解每种复制方式对参数的约束,而不是依赖 try-catch 被动兜底。
目标数组长度不足导致的下标越界
这是 System.arraycopy 最典型的报错场景。它不做任何容错,只要计算出的写入位置超出目标数组边界,立刻抛 ArrayIndexOutOfBoundsException。
- 常见错误写法:
System.arraycopy(src, 0, dest, 0, src.length),但dest.length - 哪怕只拷贝 1 个元素,若
destPos偏移量过大(如dest.length == 5却传destPos = 6),也会失败 - 正确做法:用
Math.min(src.length - srcPos, dest.length - destPos)算出安全长度,再调用
源或目标数组为 null 引发空指针
System.arraycopy 明确要求 src 和 dest 都不能为 null,否则直接抛 NullPointerException。这和数组元素为 null 是两回事——这里指的是整个数组引用为空。
- 典型场景:方法参数未校验、初始化失败后直接传参、集合取值返回
null后未判空 - 建议在调用前加判断:
if (src == null || dest == null) throw new IllegalArgumentException("数组不能为 null") - 使用
Arrays.copyOf可规避此问题(它内部会判空并抛更明确的异常)
类型不匹配引发的 ArrayStoreException
当源数组和目标数组的组件类型不兼容时,System.arraycopy 会拒绝拷贝并抛 ArrayStoreException。例如把 String[] 拷进 Integer[],或基本类型数组与引用类型数组互拷。
- 注意:这种异常不会在编译期发现,运行时才暴露
- 避免方式:确保两个数组声明类型一致,或使用泛型容器替代原始数组
-
clone()和Arrays.copyOf在同类型数组间更安全,但跨类型仍会失败
误用引用赋值当成“复制”
写成 int[] b = a 并不是复制,只是让 b 指向同一块内存。后续修改 b 会影响 a,看似没异常,实则埋下逻辑隐患。
- 表现:多个地方修改“副本”,结果原数组意外变化
- 排查技巧:打印两个数组的
System.identityHashCode(),相同说明是同一对象 - 真正复制应选
a.clone()、Arrays.copyOf(a, a.length)或System.arraycopy
不复杂但容易忽略:异常不是缺陷,而是系统在告诉你“长度算错了”或“对象还没准备好”。看清文档里每个参数的语义,比事后调试更快。











