HOWTO · Java
在 Java 中使用 AND 和 OR 运算符
使用 Java 的 && 和 || 组合布尔条件,理解短路求值,并避免将其与 & 和 | 混淆。
本页内容
当所有条件都必须为真时使用 &&,只要一个条件为真时使用 ||。两者都会进行短路求值:只有右侧仍可能改变结果时,Java 才会计算右侧。因此 text != null && !text.isEmpty() 在 text 为 null 时不会调用 isEmpty()。
! 会反转布尔条件。Java 要求 boolean 或 Boolean,不会把数字或非空字符串自动转换成真值。Java Language Specification 规定了这些规则。
选择 &&、|| 和 !
只有两个操作数都为真时 && 才为真;任意一个为真时 || 为真。以下程序已在 Polyglot 的 OpenJDK 11.0.32 中编译并运行。
public class LogicalOperators {
public static void main(String[] args) {
boolean hasTicket = true;
boolean isMember = false;
System.out.println("ticket && member: " + (hasTicket && isMember));
System.out.println("ticket || member: " + (hasTicket || isMember));
System.out.println("!member: " + !isMember);
int age = 20;
boolean canEnter = age >= 18 && age <= 65;
System.out.println("can enter: " + canEnter);
}
}
ticket && member: false
ticket || member: true
!member: true
can enter: true
先检查 null
public class ShortCircuitBoundary {
public static void main(String[] args) {
String text = null;
boolean safe = text != null && !text.isEmpty();
System.out.println("&& with null: " + safe);
try {
boolean unsafe = text != null & !text.isEmpty();
System.out.println("& with null: " + unsafe);
} catch (NullPointerException exception) {
System.out.println("& with null: NullPointerException");
}
}
}
&& with null: false
& with null: NullPointerException
使用 && 时,左侧为 false 已能决定结果,因此不会解引用右侧。& 会计算两侧,所以这里会出现显示的异常。 Scanner.nextLine() 不返回 null;此保护模式适用于可能为空的返回值、配置或字段。
短路求值不能保护的情况
只有左侧已能决定结果时,短路求值才跳过右侧。Boolean enabled = null 需要 enabled != null && enabled;enabled && otherCondition 在拆箱时可能抛出 NullPointerException。不要把必须执行的工作放在可能被跳过的一侧。
不要用 & 替换 &&
& 和 | 可用于 boolean,但总会计算两侧;对整数它们还是位运算符。普通保护条件应使用 && 和 ||。不要在条件中放入 index++ 这类副作用,因为短路求值可能跳过它。