Java数组复制需预判异常:ArrayIndexOutOfBoundsException因越界,应取min计算长度;NullPointerException因数组为null,须提前判空;ArrayStoreException因类型不兼容,需保证组件类型一致;赋值“b=a”仅为引用共享,应用clone()或copyOf()实现真正复制。

Java数组复制不是“赋值即完事”的操作,异常往往直指逻辑疏漏。关键不在捕获,而在预判——每种异常背后都有明确的触发条件和可落地的预防动作。
ArrayIndexOutOfBoundsException:长度或偏移算错了
这是System.arraycopy最常抛的异常,它不做任何宽容处理,只要源或目标的写入范围越界,立刻失败。
- 典型场景:用
src.length当拷贝长度,但dest.length更小;或destPos设为5,而目标数组只有4个元素 - 安全做法:计算真实可拷长度——
Math.min(src.length - srcPos, dest.length - destPos) - 更省心的选择:改用
Arrays.copyOf(src, newLength),它自动分配新数组,不依赖已有目标空间
NullPointerException:数组引用本身是null
不是数组里某个元素为null,而是整个数组变量指向null。所有主流拷贝方法(arraycopy、copyOf、clone)遇到都会立即报错。
- 常见源头:方法参数未校验、集合取值返回null后直接传入、配置缺失导致数组初始化失败
- 防御方式:调用前加判空——
if (src == null || dest == null) throw new IllegalArgumentException("数组不可为空") - 封装建议:统一工具方法中提前处理null,例如返回空数组或抛带业务含义的异常
ArrayStoreException:类型根本不兼容
运行时才暴露,编译期不报错。发生在源数组元素无法存入目标数组时,比如把String[]往Integer[]里拷,或基本类型数组与包装类数组互拷。
- 根本原因:目标数组的组件类型不能容纳源数组的元素类型
- 规避要点:确保声明类型一致;跨类型场景优先用泛型容器(如
List<String>)替代原始数组 - 注意:
clone()和copyOf()在同类型间安全,但跨类型仍会失败
误以为复制成功:其实只是共享同一块内存
写int[] b = a不是复制,只是让b和a指向同一个数组对象。修改b[0],a[0]也会变——没有异常,但逻辑已错。
- 验证方法:打印
System.identityHashCode(a)和System.identityHashCode(b),相同说明是同一对象 - 真正复制应选:
a.clone()、Arrays.copyOf(a, a.length)或System.arraycopy配新数组 - 对象数组注意:
clone()仍是浅拷贝,内部对象引用不变;需深拷贝时得手动遍历或序列化

















