Java中复合赋值运算符不能直接用于null值,否则抛NullPointerException;唯一例外是String的+=会将null转为"null"字符串;包装类型会触发拆箱导致NPE;需显式判空或用Objects.requireNonNullElse处理。

Java 中复合赋值运算符(如 +=、-=、+= 等)**不能直接用于 null 值**,否则会在运行时抛出 NullPointerException。这是因为复合赋值本质上会先读取左操作数的当前值,再执行运算,最后赋值——而对 null 执行解引用(如调用 toString()、intValue() 等)就会触发异常。
字符串类型:+= 对 null 的特殊行为
唯一例外是 String 类型的 +=:
- 当左操作数为
null时,Java 编译器会自动将其转为字符串"null",再拼接 - 例如:
String s = null; s += "abc";结果是"nullabc" - 这属于编译器层面的语法糖(等价于
s = new StringBuilder().append(s).append("abc").toString()),不是通用规则
数值包装类:+= 等会触发自动拆箱
对 Integer、Double 等包装类型使用复合赋值时,JVM 会尝试自动拆箱(即调用 intValue()、doubleValue()):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Integer i = null; i += 1;→ 运行时报NullPointerException - 本质是
i = Integer.valueOf(i.intValue() + 1),而i.intValue()在i == null时失败 - 同理适用于
Long、Float、Boolean(&=、|=等)
安全处理 null 的常用方式
避免 NPE,需在复合赋值前显式判空或提供默认值:
立即学习“Java免费学习笔记(深入)”;
- 用三元运算符提供默认值:
i = (i == null) ? 0 : i; i += 1; - 合并写法:
i = (i == null ? 0 : i) + 1; - JDK 8+ 可用
Objects.requireNonNullElse:i = Objects.requireNonNullElse(i, 0) + 1; - 字符串拼接建议统一初始化:
String s = ""; s += maybeNullStr;,避免依赖null转"null"的隐式行为
自定义对象不支持复合赋值
Java 不支持用户重载运算符,因此自定义类(如 User、Money)无法使用 += 等操作符,更不存在 null 处理问题。必须通过方法调用实现类似逻辑,此时可自主控制 null 行为,例如:
money.add(otherMoney != null ? otherMoney : Money.ZERO);- 在
add方法内部做空值校验和默认处理

















