Operator lub jest zwarty, gdy pierwszy operand jest prawdziwy. Tak więc, nie wyrzuć NullPointerException
.
Jak słusznie zaznacza @prajeesh w komentarzach, sposób, w jaki zwarcie jest używane w prawdziwym kodzie, zapobiega NullPointerException
za każdym razem, gdy mamy do czynienia z interfejsem API, który może zwrócić wartość null. Tak więc, na przykład, jeśli istnieje metoda, która zwraca readStringFromConsole
albo aktualnie dostępne ciąg lub null, jeśli użytkownik nie wpisuj nic, moglibyśmy napisać
String username = readStringFromConsole();
while (username == null || username.length() == 0) {
// No NullPointerException on the while clause because the length() call
// will only be made if username is not null
System.out.println("Please enter a non-blank name");
username = readStringFromConsole();
}
// Now do something useful with username, which is non-null and of nonzero length
Na marginesie, API, która zwraca dane wprowadzone przez użytkownika powinien zwrócić pusty łańcuch, gdy użytkownik niczego nie wpisuje, i nie powinien zwracać wartości null. Zwracanie wartości null jest sposobem na powiedzenie "nie ma nic dostępnego", podczas gdy zwracanie pustego ciągu jest sposobem na powiedzenie "użytkownik niczego nie wpisał" i tak jest preferowane.
Zwarcie będzie się działo, gdy wynik pierwszego operandu może zdefiniować wynik operacji logicznej. Dla '&&' pierwsze stawanie się 'false' spowoduje, że wynik' false' będzie definitywnie i dla '||' pierwsze stawanie się prawdziwym sprawi, że wynik będzie "prawdziwy" zdecydowanie. Tak więc pierwszy operand będący "prawda" zawsze będzie powodował zwarcie dla operatora '||'. –
Dlaczego jest mniej proste dzięki ||? Jest to dokładnie tak samo proste jak w przypadku &&. Obliczanie wyrażeń jest zatrzymywane, gdy znana jest wartość całego warunku. Wyrażenia są oceniane od lewej do prawej. –
@ MichaelSchmeißer: Przepraszam, nie wiem, jak to przegapiłem, będąc prostym. – Vivek