HOWTO · Java

在 Java 中使用 AND 和 OR 运算符

使用 Java 的 && 和 || 组合布尔条件,理解短路求值,并避免将其与 & 和 | 混淆。

本页内容

当所有条件都必须为真时使用 &&,只要一个条件为真时使用 ||。两者都会进行短路求值:只有右侧仍可能改变结果时,Java 才会计算右侧。因此 text != null && !text.isEmpty()textnull 时不会调用 isEmpty()

! 会反转布尔条件。Java 要求 booleanBoolean,不会把数字或非空字符串自动转换成真值。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 && enabledenabled && otherCondition 在拆箱时可能抛出 NullPointerException。不要把必须执行的工作放在可能被跳过的一侧。

不要用 & 替换 &&

&| 可用于 boolean,但总会计算两侧;对整数它们还是位运算符。普通保护条件应使用 &&||。不要在条件中放入 index++ 这类副作用,因为短路求值可能跳过它。