HOWTO · Java

Usar operadores AND e OR em Java

Use && e || do Java para combinar condições booleanas, entender o curto-circuito e não confundi-los com & e |.

Nesta página

Use && quando todas as condições precisam ser verdadeiras e || quando uma basta. Ambos fazem curto-circuito: Java avalia o lado direito apenas se ele ainda puder mudar o resultado. Assim, text != null && !text.isEmpty() não chama isEmpty() quando text é null.

! inverte uma condição booleana. Java exige boolean ou Boolean; números e strings não são convertidos implicitamente. A especificação Java define as regras.

Escolher &&, || e !

&& só é verdadeiro se ambos os operandos forem verdadeiros; || é verdadeiro se um deles for verdadeiro. Este programa foi compilado e executado no Polyglot com 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

Verificar null primeiro

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

Com &&, a condição falsa à esquerda evita o acesso à direita. & avalia os dois lados e produz a exceção mostrada. Scanner.nextLine() não retorna null; essa guarda serve para retornos, campos e configurações que podem ser nulos.

O que o curto-circuito não protege

Ele só pula o lado direito quando o esquerdo já decide o resultado. Um Boolean enabled = null precisa de enabled != null && enabled; enabled && otherCondition pode lançar NullPointerException no unboxing. Não coloque trabalho obrigatório em um lado que pode ser ignorado.

Não trocar && por &

& e | aceitam booleanos, mas sempre avaliam ambos os lados e também são operadores bit a bit para inteiros. Use && e || em guardas normais e evite efeitos colaterais, como index++, dentro da condição.