Java逻辑运算符仅作用于boolean类型,&&和||为短路运算符,&和|可非短路执行;!为一元取反运算符,不可用于数值或连用;Boolean空值会导致NPE。

Java里的基本逻辑运算符就三个:&&(逻辑与)、||(逻辑或)、!(逻辑非),它们只对boolean类型操作,不能直接用于数字或对象。
为什么&&和||会跳过右边表达式
因为它们是“短路”运算符:只要左边已能确定整个结果,就不会计算右边。比如false && someMethod()中,someMethod()根本不会执行;同理true || someMethod()也不会调用右边。
这既是优化,也是陷阱——如果你依赖右边的副作用(比如修改变量、打日志),短路会导致行为不一致。
- 想强制两边都执行?改用
&和|(按位运算符,但对boolean也有效) -
&&优先级高于||,!a || b && c等价于(!a) || (b && c) - 别写
if (x != null && x.length() > 0)这种——&&保证了x非空后才调用length(),这是安全写法
!只能作用于单个布尔表达式,不能连用或省略括号
!是一元运算符,后面必须紧跟一个布尔值或布尔表达式。常见错误是误以为!a == b等价于a != b,其实它是(!a) == b,语义完全不同。
立即学习“Java免费学习笔记(深入)”;
- 正确写法:
if (!(x > 0 && y ,括号不能少 - 错误写法:
if (!x > 0)—— 编译失败,因为!x对int不合法 - 避免歧义:用
!=代替!Objects.equals(a, b)这类否定比较,更直白
别把逻辑运算符和位运算符混用
&&/||只能用于boolean;&/|既能用于整数(按位),也能用于boolean(非短路逻辑)。类型错了会编译报错:
boolean a = true, b = false; System.out.println(a & b); // 合法,结果 false System.out.println(5 & 3); // 合法,按位与,结果 1 System.out.println(a && 3); // 编译错误:无法将 int 转为 boolean
- 整数之间永远用
&、|、^做位运算,别用&& - 条件判断一律用
&&/||,除非你明确需要非短路行为 -
Boolean包装类参与&&时会自动拆箱,但若为null会抛NullPointerException
最容易被忽略的是Boolean类型的空值风险,以及把!当成“不等于”的简写——它只是取反,不是比较运算符。










