NegativeArraySizeException是Java中因创建负长度数组而抛出的未检查运行时异常;它发生在数组创建阶段,需通过校验长度非负来避免,与访问越界的ArrayIndexOutOfBoundsException有本质区别。

NegativeArraySizeException 是 Java 中一种运行时异常,当代码尝试创建长度为负数的数组时抛出。它继承自 RuntimeException,属于未检查异常(unchecked exception),编译器不会强制要求捕获或声明。
为什么会触发 NegativeArraySizeException?
Java 规定数组长度必须是非负整数(≥ 0)。只要在 new 表达式中传入负值,JVM 就会在运行时立即拒绝并抛出该异常。
- 直接写死负数:
int[] arr = new int[-5]; - 计算结果为负:
int len = someCalculation(); int[] arr = new int[len];(若len为负) - 用户输入或外部数据未校验:
Scanner sc = new Scanner(System.in); int n = sc.nextInt(); String[] data = new String[n];(输入 -1 就崩溃)
如何避免这个异常?
核心思路是:**在创建数组前,确保长度表达式结果非负**。
- 对变量做显式判断:
if (size - 使用
Math.max(0, size)安全兜底(但要注意语义是否合理——长度为 0 可能掩盖逻辑错误) - 对用户输入、配置值、计算结果等所有外部来源的长度值,统一加校验
- 在方法文档中明确约定参数范围,例如 Javadoc 写明
@param size the number of elements, must be >= 0
它和 ArrayIndexOutOfBoundsException 有啥区别?
两者都和数组有关,但发生时机和原因不同:
立即学习“Java免费学习笔记(深入)”;
- NegativeArraySizeException:发生在数组创建阶段,是因为长度非法
-
ArrayIndexOutOfBoundsException:发生在数组访问阶段,比如
arr[-1]或arr[10](超出索引范围)
简单说:一个卡在“生不出来”,一个卡在“找不着位置”。
能不能捕获并恢复?
技术上可以 try-catch,但一般不推荐:
- 负长度通常是程序逻辑错误,不是偶发条件,捕获后继续执行可能掩盖真正问题
- 除非你有明确的降级策略(例如自动改为长度 0 或从默认配置读取),否则应让异常暴露,便于定位修复
- 日志记录 + 提前校验,比事后捕获更可靠


















