使用&&可实现空指针安全访问,因其短路特性使左侧为false时跳过右侧执行;需将判空与取值写在同一表达式中才生效。

用 && 把检查条件和后续操作串成一条表达式,就能在左侧为 false 时自动跳过右侧——这天然挡住了空指针。
用 && 替代 & 做安全访问
Java、JavaScript、Go 等语言中,&& 是短路运算符,& 则不是。一旦写错,空指针风险立刻出现:
-
if (user != null && user.getProfile() != null):安全。若user为null,getProfile()根本不调用 -
if (user != null & user.getProfile() != null):危险。即使user是null,getProfile()仍会执行,触发 NPE
多层嵌套访问的链式保护
访问深层属性(如 user.getAddress().getCity().equals("北京"))时,逐级用 && 拼接,形成“守门人链条”:
if (user != null && user.getAddress() != null && user.getAddress().getCity() != null && user.getAddress().getCity().equals("北京"))- 每一步都是前一步成立的前提,任一环节为
false,后续全部跳过 - 比嵌套 if 更紧凑,也比 try-catch 更轻量、更语义清晰
配合布尔方法做条件前置
把可复用的检查逻辑封装成返回 boolean 的方法,再用 && 组合,让主流程保持干净:
private boolean isEligibleForDiscount(User user) { return user != null && "VIP".equals(user.getLevel()); }if (isEligibleForDiscount(user) && applyDiscount()) { ... }- 既复用了校验逻辑,又延续了短路保护——若用户不满足资格,
applyDiscount()不会执行
注意边界:&& 只防调用,不防赋值
短路特性只作用于表达式求值过程,对变量赋值无保护:
-
String city = user != null && user.getAddress() != null ? user.getAddress().getCity() : null;✅ 安全 -
String city = user.getAddress().getCity();❌ 即使前面有 if 判空,这行单独写仍可能 NPE - 关键在“是否把判空和取值写在同一表达式里”,脱离短路上下文就失效











