数组空指针异常源于对 null 数组引用调用操作(如 length、遍历、Arrays 工具方法),主因是声明未初始化、方法返回 null 未校验或嵌套访问未判空;应优先返回空数组而非 null,并配合 Optional 或 Objects.requireNonNull 防御处理。

数组空指针异常(NullPointerException)在 Java 中常因“把 null 当作数组来用”而触发,比如调用 array.length、遍历 array[i]、或用 Arrays.asList(array) 等操作。它不是数组越界(ArrayIndexOutOfBoundsException),而是数组引用本身为 null 就已出错——哪怕你还没访问任何元素。
数组声明后未初始化就直接使用
这是最典型的根源:声明了数组变量,但没分配内存,其值默认为 null。
-
错误写法:
String[] names; System.out.println(names.length);→ 直接抛 NPE -
正确做法:声明即初始化,或明确赋值后再使用:
String[] names = new String[5];或String[] names = {"a", "b"}; - 局部变量不会自动初始化,必须显式创建;类字段虽有默认值
null,但使用前仍需检查或确保已赋值
方法返回 null 数组时未做判空
尤其常见于工具类、DAO 层或远程调用结果——比如 getRoles() 可能返回 null 而非空数组。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不要假设“方法返回数组就一定非空”,一律先校验:
if (roles != null) { for (String r : roles) {...} } - 更优策略是**约定返回空数组而非
null**:return roles == null ? new String[0] : roles;——这比处处判空更彻底、更符合防御性设计 - Spring、MyBatis 等框架默认支持空集合/空数组返回,善用配置(如 MyBatis 的
defaultStatementTimeout不影响此逻辑,但可配合@SelectProvider统一兜底)
对 null 数组执行工具类操作
像 Arrays.toString()、Arrays.stream()、Arrays.asList() 这些方法,传入 null 都会立即抛 NPE,不给机会捕获。
立即学习“Java免费学习笔记(深入)”;
- 调用前加保护:
Arrays.toString(arr == null ? new String[0] : arr) - 用
Objects.requireNonNull(arr, "roles array must not be null")在入口处快速失败,带明确定义的错误信息 - JDK 9+ 的
Arrays.setAll()、Arrays.parallelSort()同样要求非 null,不能跳过检查
嵌套结构中数组字段为 null
例如 User user = getUser(); String[] tags = user.getTags();,若 user 或 getTags() 返回 null,链式访问极易崩。
- 避免
user.getTags().length这类写法;改用分步判空或 Optional 包装 - 推荐模式:
String[] tags = Optional.ofNullable(user).map(User::getTags).orElse(new String[0]); - DTO 或 VO 类中,数组字段建议使用构造器或 Builder 模式强制初始化,杜绝字段级
null

















