Java中&&和||是短路运算符,左边结果能确定整体真假时跳过右边执行;&和|非短路,仅在必须执行右边副作用时使用;!优先级高,易出错,应加括号明确逻辑。

Java中&&和||为什么有时不执行右边表达式
因为它们是“短路运算符”——一旦左边结果已能确定整个表达式的真假,右边就直接跳过。这不是优化技巧,而是Java语言规范强制行为。
-
&&:左边为false→ 整个结果必为false,右边不执行(比如obj != null && obj.getName().length() > 0中,obj为null时不会触发空指针) -
||:左边为true→ 整个结果必为true,右边不执行(比如user.isAdmin() || user.hasPermission("edit"),管理员身份已满足时,权限检查不触发) - 误用
&或|替代&&/||会导致副作用意外执行(如i++ > 0被多算一次)
什么时候必须用&或|而不是&&/||
仅当右边表达式有**必须发生**的副作用,且你明确需要它被执行时才考虑非短路版本。
- 典型场景极少:单元测试中验证方法是否被调用、日志埋点、资源清理逻辑等
- 例如:
logAttempt() & validateInput()确保日志先打,再校验;但更推荐拆成两行,语义更清晰 - 在布尔上下文中用
&/|属于反模式,可读性差,IDE通常会警告
!运算符的常见误用陷阱
! 只作用于紧邻的单个操作数,优先级高于 && 和 ||,极易因括号缺失导致逻辑翻车。
- 错误写法:
!a && b实际等价于(!a) && b,但若本意是!(a && b),结果完全相反 - 涉及关系表达式时尤其危险:
!x == y会被解析为(!x) == y,而x是int类型 → 编译失败(不能对数字取非) - 安全做法:所有复合条件加括号,如
!(x > 0 && y ,避免依赖优先级记忆
逻辑运算符和位运算符在布尔值上的行为差异
表面上看 && 和 & 对布尔值结果一致,但语义和执行逻辑完全不同。
立即学习“Java免费学习笔记(深入)”;
-
&&是逻辑运算符,只接受布尔操作数,支持短路,用于流程控制 -
&是位运算符,重载后可用于布尔值,但无短路,且允许整数参与(如5 & 3) - 混用会破坏代码意图:用
&写条件判断,别人第一反应是“你在做位掩码”,不是“你在做逻辑与” - 编译器不会阻止,但静态检查工具(如 SonarQube)会标记为 bug 级别问题
! 和关系运算符连写不加括号,是新人和老手都高频踩坑的点——它不报错,但逻辑已悄然反转。









