使用&&短路特性可安全判空并链式访问:左侧为false时跳过右侧执行,避免空指针异常;多层嵌套需逐级&&守门;封装布尔方法或配合三元运算亦能保持短路保护。

用 && 把判空检查和后续操作写在同一表达式里,就能在左侧为 false 时跳过右侧执行——空对象根本没机会触发方法调用,自然拦截了空指针风险。
把“是否为空”和“取值/调用”绑在一条表达式里
短路保护只在单个布尔表达式内生效。关键不是写了 if (user != null),而是让判空和访问紧挨着:
- ✅ 安全:
if (user != null && user.getName().length() > 0)—— user 为 null 时,getName()根本不执行 - ❌ 危险:先
if (user != null),再单独写user.getName()—— 这行代码脱离上下文,依然可能 NPE - ⚠️ 注意:别误用
&,它不短路,user != null & user.getName()会照常调用方法
多层嵌套访问,靠逐级守门形成链条
访问 user.getProfile().getAvatar().getUrl() 这类深层结构时,每一层都可能是 null。用 && 串起来,就是天然的守门人链:
if (user != null && user.getProfile() != null && user.getProfile().getAvatar() != null && user.getProfile().getAvatar().getUrl() != null)- 任一环节为
false,后面全部跳过,不会走到getUrl() - 比嵌套多个
if更紧凑,也比try-catch更轻量、语义更清晰
封装成布尔方法,兼顾复用与安全
把常用校验逻辑抽成返回 boolean 的方法,再用 && 组合,主流程更干净,且短路保护依然有效:
- 例如:
private boolean hasValidAddress(User user) { return user != null && user.getAddress() != null && user.getAddress().getCity() != null; } - 调用:
if (hasValidAddress(user) && sendNotification()) { ... } - 如果地址校验失败,
sendNotification()不会执行,既省资源又防异常
配合三元运算,安全提取默认值
需要从可能为空的对象中取值并设默认值时,把整个判断+取值写进三元表达式,依然享受短路:
String city = (user != null && user.getAddress() != null) ? user.getAddress().getCity() : "未知城市";- 左侧条件不满足,右侧取值部分完全跳过,不会报错
- 避免拆成两步(先判空再赋值),防止中间插入其他代码导致状态变化


















