EMZETT.
Login

Logical Operators

Kurz: Operatoren, um mehrere boolesche Ausdrücke zu verknüpfen: && (UND), || (ODER) und ! (Negation).

Genauer: && und || in Java werten “kurzschlussartig” aus (Short-Circuit-Evaluation): bei a && b wird b gar nicht erst geprüft, wenn a schon false ist — nützlich, um z. B. eine null-Prüfung vor einem Feldzugriff sicher zu verketten (obj != null && obj.getWert() > 0).

Im Detail

String text = null;
 
// Ohne Short-Circuit würde text.length() eine NullPointerException werfen
if (text != null && text.length() > 0) {
    System.out.println("Nicht leer");
}
 
// || funktioniert genauso herum: b wird nicht geprüft, wenn a schon true ist
boolean istWochenende(int tag) {
    return tag == 6 || tag == 7; // bei tag==6 wird "tag == 7" gar nicht ausgewertet
}
 
// Nicht-kurzschließende Varianten existieren auch: & und |
// Werten IMMER beide Seiten aus, auch wenn die erste schon entscheidet - selten genutzt
boolean beide = (a() & b()); // b() läuft auch dann, wenn a() schon false ist

Die Short-Circuit-Auswertung ist mehr als eine reine Performance-Optimierung — sie ist ein zentrales Sicherheitsmuster, um Fehler zu VERMEIDEN, indem man die “gefährliche” Prüfung erst nach einer schützenden Vorbedingung platziert (objekt != null && objekt.methode()). Die selten genutzten nicht-kurzschließenden Varianten & und | (ohne Verdopplung) werten dagegen immer beide Seiten aus, was bei Methodenaufrufen mit Seiteneffekten (z. B. beide Methoden sollen auf jeden Fall laufen, unabhängig vom Ergebnis der ersten) ausnahmsweise gewollt sein kann — im Alltagscode sind &&/|| aber die weit überwiegende Regel.

XOR und der bitweise Operator ^

Neben UND/ODER/NICHT gibt es noch das “exklusive ODER” (XOR, ^), das true liefert, wenn GENAU EINE der beiden Seiten wahr ist (nicht beide, nicht keine): true ^ true ist false, true ^ false ist true. XOR hat kein Short-Circuit-Pendant, da beide Seiten für das Ergebnis zwingend bekannt sein müssen — ein häufiger Einsatzzweck ist das Umschalten eines booleschen Zustands (geschaltet = geschaltet ^ true; kippt den Wert bei jedem Aufruf).

Häufiger Anfängerfehler: &/| statt &&/||

Ein leicht zu übersehener Tippfehler ist die Verwendung der einfachen (nicht-kurzschließenden) Operatoren &/| statt der doppelten &&/|| — der Code kompiliert dabei meist trotzdem fehlerfrei, da beide Operatorpaare auf booleschen Werten gültig sind, aber ohne Short-Circuit-Schutz kann eine eigentlich abgesicherte Prüfung wie text != null & text.length() > 0 bei text == null trotzdem eine NullPointerException werfen, weil text.length() immer ausgeführt wird.

Siehe auch: Operatoren, Comparison Operators, if-Statement