java数组拷贝方法异常处理不统一:arrays.copyof()仅校验newlength负数和original为null;copyofrange()严格检查索引范围,区分arrayindexoutofboundsexception和illegalargumentexception;system.arraycopy()无预检,全由jvm抛arrayindexoutofboundsexception。

Java数组拷贝方法本身不统一处理异常,而是把校验责任完全交给调用者。每种方法抛出的异常类型、触发条件和时机都不同,理解这些差异才能写出健壮的拷贝逻辑。
Arrays.copyOf() 的异常模式
这个方法只做两件事:分配新数组 + 复制元素(从索引0开始)。它主动检查两个边界:
- 若 newLength 为负数,立即抛出 NegativeArraySizeException
- 若 original 为 null,立即抛出 NullPointerException
它不检查原数组实际长度是否足够。比如原数组长度为2,却传入 newLength=5,不会报错——多出的3个位置用默认值(int→0,String→null)填充。这种“静默扩容”是设计行为,不是异常场景。
Arrays.copyOfRange() 的边界敏感性
该方法复制指定区间 [from, to),对索引合法性极为严格,三种异常明确对应三类越界:
- from original.length → ArrayIndexOutOfBoundsException
- to > original.length 或 from > to → IllegalArgumentException(注意:不是 IndexOutOfBounds)
- original == null → NullPointerException
例如 copyOfRange(arr, 2, 10) 中 arr 长度只有6,就会因 to 超出而抛 IllegalArgumentException;而 copyOfRange(arr, -1, 3) 则直接抛 ArrayIndexOutOfBoundsException。
System.arraycopy() 的“零容忍”策略
它不进行任何参数预检,所有校验都由 JVM 在底层执行。一旦参数违规,立刻抛出 ArrayIndexOutOfBoundsException,但不区分是源越界还是目标越界——错误信息里通常只写“Index: x, Size: y”,需靠人工回溯判断。
- 常见违规:srcPos + length > src.length
- 或 destPos + length > dest.length
- 或 length
这意味着你必须在调用前手动验证三组条件(src起始+长度、dest起始+长度、length非负),否则异常发生时调试成本很高。
clone() 和赋值引用的异常盲区
这两者看似“安全”,实则隐藏风险:
- arr.clone():若 arr 为 null,调用时直接抛 NullPointerException(不是 CloneNotSupportedException,因为数组类型自动支持克隆)
- arr2 = arr:这不是拷贝,只是引用赋值。后续访问 arr2[i] 时,若 arr 本身为 null,仍会抛 NullPointerException;若 i 超出 arr.length,则抛 ArrayIndexOutOfBoundsException
它们都不提供长度适配或空值兜底,异常完全取决于原始数组状态和后续使用方式。











