& & (AND) e ||| (OR) em declarações IF

Eu tenho o seguinte código:

if(!partialHits.get(req_nr).containsKey(z) || partialHits.get(req_nr).get(z) < tmpmap.get(z)){  
    partialHits.get(z).put(z, tmpmap.get(z));  
}

onde partialHits é um HashMap.
O que acontecerá se a primeira declaração for verdadeira? O Java ainda verificará a segunda declaração? Porque para que a primeira declaração seja verdadeira, o HashMap não deve conter a chave dada, então se a segunda declaração for verificada, eu obterei `NullPointerException'.
Portanto, em palavras simples, se tivermos o seguinte código

if(a && b)  
if(a || b)

Java verificaria b' sea' é falso no primeiro caso e se `a' é verdadeiro no segundo caso?

Não, não vai ser verificado. Este comportamento é chamado avaliação de curto-circuito e é uma característica em muitas linguagens, incluindo Java.

Comentários (1)

Não, se a for verdadeiro (num teste "ou"), b não será testado, pois o resultado do teste será sempre verdadeiro, qualquer que seja o valor da expressão b.

Faça um teste simples:

if (true || ((String) null).equals("foobar")) {
    ...
}

não **não*** lançará um NullPointerException!

Comentários (0)

Não, ele ganhou't, Java vai curto-circuitar e parar de avaliar uma vez que saiba o resultado.

Comentários (0)