Java逻辑运算符&&和||具有短路特性,即左侧操作数能确定结果时右侧完全不执行;如(a>5)&&(++b>0)中b值不变,logAndReturn("x")在true||...中不被调用,且短路可避免空指针异常。

Java 中逻辑运算符的短路特性,本质是语言规范定义的行为,不是优化技巧,而是执行逻辑:当左侧操作数已能确定整个表达式结果时,右侧操作数**完全不执行**(包括其中的赋值、方法调用、自增等副作用)。验证它最直接的方式,就是观察右侧表达式是否“真的没运行”——看变量值有没有变、方法有没有被调用、打印语句有没有输出。
用自增操作验证 && 的短路
写一段代码,让左侧为 false,右侧带 ++:
int a = 1, b = 2;
boolean result = (a > 5) && (++b > 0);
System.out.println("a=" + a + ", b=" + b + ", result=" + result);
// 输出:a=1, b=2, result=false
说明:a > 5 是 false,&& 短路生效,++b 根本没执行,所以 b 保持为 2。
反过来,把左侧改成 true:
立即学习“Java免费学习笔记(深入)”;
int a = 1, b = 2;
boolean result = (a < 5) && (++b > 0);
System.out.println("a=" + a + ", b=" + b + ", result=" + result);
// 输出:a=1, b=3, result=true
此时右侧执行了,b 自增为 3,证明短路只在必要时跳过。
用方法调用验证 || 的短路
定义一个有打印副作用的方法:
static boolean logAndReturn(String msg) {
System.out.println("执行了:" + msg);
return true;
}
然后测试:
boolean r1 = true || logAndReturn("右边");
// 输出只有:true(无任何打印)
boolean r2 = false || logAndReturn("右边");
// 输出:执行了:右边
第一行中,左侧 true 已使整个 || 表达式为 true,右侧方法压根没被调用;第二行才触发调用。这比看变量更直观——没输出,就是没执行。
用空指针防护场景反向验证
这是短路最常用的实战价值。比如:
String str = null;
if (str != null && str.length() > 0) { ... }
如果 && 不短路,str.length() 会在 str 为 null 时抛出 NullPointerException。但实际运行不会崩溃——因为 str != null 为 false,右侧被跳过。你可以故意改成 &(非短路与)来破坏它:
if (str != null & str.length() > 0) { ... } // 运行时报空指针
这个对比清晰暴露了短路存在的必要性。
注意区分 & 和 &&、| 和 ||
它们看起来相似,行为却关键不同:
- && 和 || 是逻辑运算符,带短路
- & 和 | 是按位运算符,对布尔类型也适用,但不短路——无论左边结果如何,右边一定执行
所以验证时别误用 & 替代 &&,否则永远看不到短路效果。


















