arrays.tostring() 不防御 null 引用,会直接抛出 nullpointerexception;这是明确的设计契约,所有重载版本均在入口处跳过 null 检查,直接访问 length 或遍历元素。

Arrays.toString() 方法本身不防御 null 引用,它会直接抛出 NullPointerException。这不是设计缺陷,而是明确的设计契约:该方法要求传入的数组引用必须非 null。
Arrays.toString() 的 null 行为本质
Arrays.toString() 是一个重载方法族,支持基本类型数组(int[]、double[] 等)和 Object[]。所有重载版本在入口处都不做 null 检查,而是直接访问数组的 length 属性或遍历元素。
例如,对 Object[] 的实现逻辑等价于:
for (int i = 0; i一旦 a == null,执行 a.length 就立即触发 NPE —— 这与任何其他对 null 数组调用 .length 的场景完全一致。
它不试图“安全兜底”返回 "null" 字符串,也不返回空字符串或占位符。这种“快速失败”策略让问题暴露得早、定位得准。
常见误用与典型崩溃点
- 直接传入 null 数组:Arrays.toString((String[]) null) → 抛 NPE
- 从可能为 null 的变量解包后使用:String[] names = getConfigNames(); Arrays.toString(names); —— 若 getConfigNames() 返回 null,此处崩
- 混淆 null 数组与空数组:new String[0] 是合法空数组,可安全 toString;而 null 是未初始化引用,不可操作
如何安全使用 Arrays.toString()
防御责任不在 Arrays 类,而在调用方。推荐以下实践:
- 使用 Objects.toString(arr, "null"):这是最轻量、最直接的替代方案。它内部先判空,为 null 时返回指定默认字符串
- 显式判空再调用:if (arr == null) System.out.println("array is null"); else System.out.println(Arrays.toString(arr));
- 统一封装工具方法:如 public static String safeToString(Object[] arr) { return Objects.toString(arr, "[]"); },保持语义一致
- 配合 Optional 使用(适合链式上下文):Optional.ofNullable(arr).map(Arrays::toString).orElse("null")
为什么不用 Optional 包装 Arrays.toString?
Arrays.toString() 是静态工具方法,设计目标是高效、无状态、无副作用。引入 Optional 会增加不必要的对象创建和包装开销,违背其“轻量打印辅助”的定位。Java 官方选择将空值契约交给开发者显式处理,而非在底层做模糊容忍 —— 这正是防御性编程的核心:明确边界,拒绝隐式假设。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











