NegativeArraySizeException源于数组长度为负数,需在new前校验size≥0:用户输入、计算结果、外部系统值均须显式检查,推荐if(size<0)抛IllegalArgumentException,警惕集合越界、整数溢出、-1长度等隐性负值。

遇到 NegativeArraySizeException,本质是程序在调用 new int[size] 这类语句时,size 的值为负数。Java 要求数组长度必须是非负整数,运行时直接拒绝创建,抛出该异常。关键不在于“怎么捕获它”,而在于“怎么不让它发生”——也就是在分配数组前完成有效校验。
校验必须发生在 new 之前
不能依赖 try-catch 去兜底,因为异常已表明逻辑失控。校验点必须紧邻数组创建语句之前,且覆盖所有可能路径:
- 若
size来自用户输入(如表单、命令行、API 参数),需第一时间做非负判断 - 若
size是计算结果(如input - offset、list.size() - 2),必须验证计算后是否仍 ≥ 0 - 若
size来自外部系统(如 HTTP 响应头Content-Length),要特别注意该值可能为 -1(表示长度未知)
推荐校验方式:显式检查 + 明确处理
不建议静默设为 0 或跳过,应让问题暴露得早、清楚:
- 用
if (size < 0)判断,配合throw new IllegalArgumentException("数组大小非法: " + size) - 若业务允许降级,可设默认值(如
size = Math.max(0, size)),但需记录 warn 日志说明降级原因 - 避免仅打印日志却不中断流程——后续仍会走到
new int[size]并崩溃
警惕隐性负值来源
有些负值不是明显写出来的,而是由边界或溢出引入:
-
集合操作越界:例如
list.subList(from, to).size()中from > to,结果为负 -
整数溢出:两个大
int相加(如Integer.MAX_VALUE + 1)回绕成负数,再用作数组长度 -
流长度不可信:
connection.getLength()返回 -1 表示长度未知,直接用于new byte[length]必然触发异常
MyBatis 等框架场景中的特殊注意
在 ORM 或 HTTP 客户端中,该异常常是上游参数污染的表象:
- 批量操作传入空或 null 的 List,某些旧版 MyBatis 在解析
<foreach>时可能误算内部缓冲区大小 - JSON 反序列化后字段缺失,导致默认值为 0 或 -1,未经校验即用于数组初始化
- 建议在 DAO 层入口对关键数值型参数统一做
>= 0断言,比在框架底层排查更高效

















