system.arraycopy不处理越界异常,而是直接抛出arrayindexoutofboundsexception等异常;避免异常需调用前校验5个参数:null检查、非负性检查、长度边界检查及类型兼容性检查。

System.arraycopy 本身不主动“处理”数组越界异常,而是会在参数非法时直接抛出 ArrayIndexOutOfBoundsException 或 IllegalArgumentException。它的设计原则是“快速失败”,而不是容错或静默处理。因此,**避免异常的关键在于调用前校验参数,而非依赖它内部处理**。
哪些参数会触发越界异常?
System.arraycopy 共有 5 个参数:src, srcPos, dest, destPos, length。以下任一情况都会抛出异常:
-
src 或 dest 为
null→ 抛NullPointerException -
srcPos、destPos 或 length 为负数 → 抛
ArrayIndexOutOfBoundsException - srcPos + length > src.length → 源数组越界
- destPos + length > dest.length → 目标数组越界
-
length > 0 但 src 和 dest 是不同类型的引用数组(如 String[] → Object[] 合法,String[] → Integer[] 非法)→ 抛
ArrayStoreException(运行时类型检查)
安全调用的典型写法
不要靠 try-catch “兜底”,而应在复制前做轻量校验。例如:
// 安全复制 src[2..5) 到 dest[0..3)
int srcPos = 2, length = 3;
if (src != null && dest != null
&& srcPos >= 0 && length >= 0
&& srcPos + length <h3>常见易错场景与建议</h3><p>很多越界问题源于动态计算参数时疏忽边界。例如:</p>
- 用
list.subList(from, to).toArray()得到数组后,误把to当作长度传入 → 应传to - from - 循环中递增
offset,未检查offset + chunkSize → 建议在循环条件里提前判断 - 从用户输入或配置读取
length,未做非负和上限校验 → 建议封装工具方法统一校验
要不要 try-catch?
一般不推荐仅为了捕获 ArrayIndexOutOfBoundsException 而加 try-catch。因为:
- 该异常属于 编程错误(bug),不是正常流程分支
- 吞掉异常或打印日志后继续执行,容易掩盖真实问题
- 性能上,异常抛出开销远高于前置校验
如果确实需要容错(如解析不可信外部数据),可 catch 并转为明确语义的异常,例如:throw new IllegalArgumentException("Invalid copy range: " + params, e);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











