短路或(||)右侧不执行,逻辑或(|)右侧必执行;||用于安全检查(如避免空指针),|用于强制执行副作用(如计数、日志);日常优先用||,仅当需确保右侧执行时用|。

短路或(||)和逻辑或(|)在 Java 中都表示“或”关系,结果都是只要有一个操作数为 true,整个表达式就为 true。但关键区别在于:是否**无条件执行右侧表达式**。
看左侧结果是否跳过右侧计算
这是最直接的区分方式:
-
||:左侧为
true时,右侧表达式**完全不执行**(跳过),直接返回true -
|:无论左侧是
true还是false,右侧表达式**一定执行**
典型场景:避免空指针或副作用
用 || 可以安全地做前置检查:
-
if (str != null || str.length() > 0)—— ❌ 错!应为&&;但反例更说明问题:if (str == null || str.isEmpty())✅ 安全,因为 str 为null时,isEmpty()不会被调用 -
if (obj != null || obj.isValid())—— 如果obj是null,isValid()就不会触发,避免NullPointerException - 而换成
|,哪怕obj是null,obj.isValid()仍会执行,直接报错
需要强制执行两边时才用 |
当右侧有必须发生的操作(比如计数、日志、状态变更),且你明确希望它总被执行:
立即学习“Java免费学习笔记(深入)”;
-
boolean a = false; int count = 0; if (a | (++count > 0)) { ... }→count一定会加 1 -
if (checkPermission() | logAccess())→ 即使权限检查失败,日志也照记 - 注意:| 在布尔上下文中是逻辑或,在整数上下文中是按位或,语义不同但写法相同
性能与可读性建议
日常条件判断中,优先使用 ||:
- 更高效:省去不必要的计算
- 更安全:天然规避因右侧副作用引发的异常
- 更符合直觉:多数人预期“或”的短路行为
- 只有当你明确需要右侧一定执行,并已评估过副作用影响时,才选用 |


















