Java数组判空必须先检查arr == null再判断arr.length == 0,否则null时访问length会抛NullPointerException;最安全写法是arr == null || arr.length == 0,利用短路逻辑规避NPE。

Java里数组判空为什么不能只用 length == 0
因为 length 是数组对象的属性,如果数组变量本身是 null,直接访问 arr.length 会抛出 NullPointerException。所以只判 length == 0 前必须先确保数组非 null。
常见错误现象:java.lang.NullPointerException: Cannot read the array length because "<array variable>" is null
- 使用场景:方法入参校验、集合转数组后处理、JSON反序列化返回的数组字段
- 正确顺序永远是先
arr != null,再arr.length == 0 - 别写成
arr.length == 0 || arr == null—— 这样一上来就触发 NPE
最安全的判空写法:arr == null || arr.length == 0
这是短路逻辑:前面为 true 就不执行后面,完全规避 NPE 风险。它同时覆盖了「未初始化」和「初始化但无元素」两种情况。
示例:
立即学习“Java免费学习笔记(深入)”;
if (strArray == null || strArray.length == 0) {
System.out.println("数组为空或未创建");
}
- 不要用
Objects.isNull(arr)替代arr == null—— 没必要引入额外对象调用,且可读性反而下降 - 对基本类型数组(如
int[])同样适用,length是所有数组的公共属性 - 注意:这个判断不适用于
List或其他集合,那是另一套规则
为什么不用 Arrays.asList(arr) 判空?
有人想借 Arrays.asList() 转成 List 再调 isEmpty(),这会引入三个问题:
- 如果
arr是null,Arrays.asList(null)不报错,但返回一个含单个null元素的列表,导致误判 - 基本类型数组(如
int[])传入会自动装箱成Integer[],但Arrays.asList(intArr)实际返回的是[intArr](一个元素的列表),不是你预期的元素列表 - 多一次对象创建,无谓开销,纯属绕远路
工具类封装要注意的点
如果项目里高频使用,可以封装成静态工具方法,但得小心这些细节:
- 方法签名建议用泛型
<T> boolean isEmpty(T[] arr),兼容所有引用类型数组 - 不要为基本类型单独重载 —— Java 不支持泛型基本类型,
int[]等只能靠 Object 类型参数承接,此时需额外 instanceof 判断,容易出错 - 别在工具方法里偷偷做
Arrays.toString()或日志打印 —— 判空应该是轻量、无副作用的操作
真正容易被忽略的是:二维数组(如 String[][])的「空」有多个层次——外层数组为 null、外层长度为 0、某行内层数组为 null。这种场景下,arr == null || arr.length == 0 只管最外层,别默认它能递归检查。










