&& (AND) i || (OR) w wyrażeniach IF

Mam następujący kod:

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

gdzie partialHits jest HashMap.
Co się stanie, jeśli pierwsze stwierdzenie będzie prawdziwe? Czy Java nadal będzie sprawdzać drugie stwierdzenie? Ponieważ aby pierwsze stwierdzenie było prawdziwe, HashMap nie powinna zawierać podanego klucza, więc jeśli drugie stwierdzenie zostanie sprawdzone, otrzymam wyjątek NullPointerException.
Tak więc w prostych słowach, jeśli mamy następujący kod

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

czy Java sprawdziłaby b jeśli a jest fałszywe w pierwszym przypadku i jeśli a jest prawdziwe w drugim przypadku?

Nie, to nie będzie sprawdzane. Takie zachowanie nazywane jest short-circuit evaluation i jest cechą wielu języków, w tym Javy.

Komentarze (1)

Nie, jeśli a jest prawdziwe (w teście lub), b nie będzie testowane, ponieważ wynik testu zawsze będzie prawdziwy, niezależnie od wartości wyrażenia b.

Zrób prosty test:

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

nie będzie nie rzucał wyjątku NullPointerException!

Komentarze (0)

Nie, Java zrobi zwarcie i przestanie oceniać, gdy będzie znała wynik.

Komentarze (0)