HOWTO · Java

AND- und OR-Operatoren in Java verwenden

Verwenden Sie Java && und || für boolesche Bedingungen, verstehen Sie die Kurzschlussauswertung und verwechseln Sie sie nicht mit & und |.

Auf dieser Seite

Verwenden Sie &&, wenn alle Bedingungen wahr sein müssen, und ||, wenn eine Bedingung genügt. Beide Operatoren werten von links nach rechts mit Kurzschlussauswertung aus: Die rechte Seite wird nur ausgewertet, wenn sie das Ergebnis noch ändern kann. Deshalb ist text != null && !text.isEmpty() sicher; bei null wird isEmpty() nicht aufgerufen.

! negiert eine boolesche Bedingung. Java erwartet hier boolean oder Boolean; Zahlen und nichtleere Zeichenketten gelten nicht automatisch als wahr. Die Java Language Specification beschreibt die Regeln für && und ||.

&&, || und ! auswählen

&& liefert nur dann true, wenn beide Operanden wahr sind. || liefert true, wenn mindestens einer wahr ist. Das folgende, im Polyglot-Image mit OpenJDK 11.0.32 ausgeführte Programm zeigt beide Fälle und eine Bereichsprüfung.

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

Für einen Bereich müssen beide Grenzen gelten, daher passt &&. Für eine Berechtigung wie isAdmin || hasTemporaryPass genügt eine der beiden Bedingungen. Setzen Sie bei gemischten Ausdrücken Klammern, wenn die Gruppierung nicht sofort lesbar ist.

Null-Prüfung zuerst schreiben

Stellen Sie die sichere Prüfung links vor einen möglichen Dereferenzierungszugriff:

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

Bei && entscheidet die linke falsche Bedingung bereits das Ergebnis. & wertet dagegen beide Seiten aus und der Aufruf auf null löst hier die gezeigte Ausnahme aus. Scanner.nextLine() gibt keine nullfähige Zeichenkette zurück; die Bedingung ist für nullfähige Rückgabewerte, Konfigurationen oder Felder gedacht.

Was Kurzschlussauswertung nicht schützt

Sie überspringt nur die rechte Seite, wenn die linke das Ergebnis festlegt. Ein Boolean enabled = null braucht deshalb enabled != null && enabled; enabled && otherCondition kann beim Unboxing eine NullPointerException auslösen. Legen Sie auch keine zwingende Arbeit auf eine Seite, die übersprungen werden kann.

&& nicht durch & ersetzen

& und | können mit booleschen Operanden verwendet werden, werten aber immer beide Seiten aus. Mit Ganzzahlen sind sie zudem bitweise Operatoren. Verwenden Sie für normale Schutzbedingungen && und ||; verwenden Sie einen einzelnen Operator nur, wenn die Auswertung beider Seiten ausdrücklich notwendig und sicher ist. Vermeiden Sie Seiteneffekte wie index++ in Bedingungen, weil Kurzschlussauswertung sie abhängig vom linken Ergebnis überspringen kann.