Java - dúvida na sequência de análise de elementos dentro de um IF

Tenho uma dúvida de comportamento em tempo de execução: se há duas condições dentro de um IF, e a primeira for falsa, ele testa a segunda?

Testei localmente (Eclipse / Windows / jdk-16), e ele não testou a segunda condição.

Há alguma situação, que vocês conhecem, que ele testaria a segunda condição?

Obrigado.

================================================

public class TesteIf {

public static boolean a() {
    System.out.println("a");
    return false;
}

public static boolean b() {
    System.out.println("b");
    return true;
}

public static void main(String[] args) {
    
    if (a() && b()) {
        System.out.println("Deu certo!");
    }
}

}

Ele não testa a segunda, porque ele não tem motivo para testa-la. O código só é executado se as duas condições forem true por conta do operador &&, então se a primeira for falsa ele nem se dá ao trabalho de testar a segunda.

1 curtida

Os operadores && e || são short-circuit, ou seja, eles só analisam o mínimo necessário.

No caso do &&, a expressão só é verdadeira se ambas as condições forem verdadeiras.
Então se a primeira for falsa, nem adianta avaliar a segunda, pois já é certeza que o resultado será false. Somente se a primeira for verdadeira, aí sim ele precisa avaliar a segunda, para saber se ambas são verdadeiras.

Por isso que no seu caso ele só avalia a(). Como ela retorna false, então a expressão já será falsa, e aí ele nem avalia b().

Se a() retornasse true, aí sim ele precisaria avaliar b().


Este comportamento é descrito na especificação da linguagem:

… evaluates its right-hand operand only if the value of its left-hand operand is true

Ou seja, ele avalia o operando à direita apenas se o valor do operando à esquerda for true.

1 curtida

Entendi. Vi depois que se usar só um “&” ou só um “|”, ele testa as duas condições.

Muito obrigado pela explicação detalhada.

Sim, essas são as versões sem short-circuit dos operadores && e ||, então eles sempre avaliam todos os operandos.

1 curtida