Java中短路运算符&&和||能提升效率并避免空指针异常:左操作数为false时&&跳过右操作数,为true时||跳过右操作数;而&、|总会执行两边,可能引发异常或冗余计算。

Java中的短路与(&&)和短路或(||)能避免不必要的计算,让条件判断更高效——关键在于它们会根据左操作数的结果决定是否执行右操作数。
理解短路行为的本质
短路运算符不总是计算两个操作数:
- &&:左操作数为 false 时,整个表达式必为 false,右操作数**跳过执行**;
- ||:左操作数为 true 时,整个表达式必为 true,右操作数**跳过执行**。
这和非短路的 &、| 不同,后者总会执行两边,可能引发空指针、冗余耗时或副作用。
避免空指针异常(最常见用途)
访问对象属性前先判空,是短路最典型的应用场景:
// ✅ 安全:obj 为 null 时,不会执行 obj.getName()
if (obj != null && "admin".equals(obj.getName())) { ... }
<p>// ❌ 危险:obj 为 null 时抛出 NullPointerException
if (obj.getName() != null && "admin".equals(obj.getName())) { ... }</p>
减少昂贵操作的执行次数
把开销小、高概率决定结果的条件放在左边,可显著节省资源:
- 文件存在性检查比读取内容快得多 →
file.exists() && readFile(file).contains("keyword") - 用户登录态验证比数据库查询快 →
isUserLoggedIn() && hasPermissionInDB(userId, "delete") - 简单数值比较比正则匹配快 →
str.length() > 5 && str.matches("[a-zA-Z0-9]+")
小心副作用与调试陷阱
短路意味着右操作数可能不执行,若它含副作用(如日志、计数、状态变更),结果会不符合预期:
// ❌ count++ 可能不执行,逻辑被破坏
if (isValid() && count++ > 0) { ... }
<p>// ✅ 明确分离判断与副作用
boolean valid = isValid();
if (valid) count++;
if (valid) { ... }</p>
调试时也注意:IDE断点打在右操作数上,可能根本不会触发——这不是bug,是短路的正常表现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











