2012-04-15 18 views
11

Oba operatory warunkowe: & & i || są zwarte zgodnie z
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html, co oznacza, że ​​drugi operand nie musi być czasami oceniany.zachowanie się zwarcia operatora warunkowego LUB (||)

Czy mógłby Pan podać przykład, w którym operator warunkowy OR (||) zostałby zwarty?

zachowanie Zwarcie jest dość prosta z operatorem warunkowym-I (& &), jak w:

if (false & & (1> 0)), a następnie drugi argument: (1> 0) nie musi być oceniany, ale nie może znaleźć/pomyśleć o przykładzie warunkowego-OR.

+1

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 '||'. –

+1

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. –

+0

@ MichaelSchmeißer: Przepraszam, nie wiem, jak to przegapiłem, będąc prostym. – Vivek

Odpowiedz

1
if(true || (0 > 1)) 

Pierwsze stwierdzenie jest prawdziwe, więc nie ma konieczności oceny drugiego.

15

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.

+1

Nie dostałem sytuacji, w której to konkretne 'prawda || foo.equals ("") 'sprawia, że ​​rzeczy wyglądają rozsądnie logicznie, powinno być' if (foo == null || foo.equals (""))), które będą zwarte, gdy 'foo' ma wartość null i tym samym zapobiegnie NPE . –

1
if (true || comparison) 

porównanie nigdy nie będzie oceniane, ponieważ jego wynik jest nieistotny (ponieważ pierwszy argument jest już prawdziwy).

Powiązane problemy