短路逻辑能防止调用空对象属性,核心在于跳过右侧可能异常的操作;&&先判空再访问,||适合兜底场景,&和|不短路易致NPE,Optional和instanceof是更安全的进阶替代。

短路逻辑能防止调用空对象的属性,核心在于它会跳过右侧可能引发异常的操作——只要左侧判断已足以确定整个表达式结果。
短路与(&&)先判空再访问
当用 && 连接两个条件时,Java 保证:如果左边为 false,右边根本不会执行。这正好用来保护对 null 对象的属性或方法调用。
- 写法示例:
str != null && str.length() > 0 - 执行过程:若
str是null,左边str != null为false,整个表达式必为false,str.length()就不会被调用,自然避开空指针异常 - 错误写法对比:
str.length() > 0 && str != null—— 此时若str为null,还没走到!= null判断,就已在第一步抛出异常
短路或(||)配合非空断言更灵活
|| 的短路特性是“左为 true 就不看右”,它适合在默认值兜底、状态兜底等场景中避免空操作。
- 常见组合:
obj == null || obj.isValid(),用于快速跳过无效对象的校验 - 搭配赋值逻辑:
String name = (user != null && user.getName() != null) ? user.getName() : "Unknown",其中&&确保user.getName()安全执行 - 注意:单独用
||不能直接防空,但它和&&组合后可构建更健壮的守卫条件
别混淆短路与非短路运算符
& 和 | 是位运算符兼逻辑运算符,但它们不短路——无论左边结果如何,右边一定执行。这就埋下隐患:
- 错误示例:
str != null & str.length() > 0,即使str为null,str.length()仍会被调用,NPE 照样发生 - 正确选择:逻辑判断一律用 && 和 ||;只有明确需要两边都执行(比如位掩码计算),才考虑 & 或 |
- 编译器不会警告这种误用,需靠习惯和代码审查识别
进阶提示:结合现代语法更省心
虽然短路是通用方案,但 Java 8+ 提供了更简洁安全的替代方式:
- 用
Optional.ofNullable(obj).map(...).orElse(...)替代多层判空链 - Java 14+ 可配合
instanceof模式变量,如if (obj instanceof String s && s.length() > 0),一次完成类型检查 + 非空绑定 + 属性访问 - 注意:这些新语法底层仍依赖短路机制,理解 && 的行为是掌握它们的基础
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











