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.