2013-06-07 18 views
11

Napisałem krótki kod Javy, który powoduje wyjątek NullPointerException. Czy ktoś ma wyjaśnienie tego? Kod:Dlaczego wyjątek NullPointerException występuje w skrócie IF

int val = 2; 
Boolean result = (val == 0) ? false : ((val == 1) ? true : null); 

również następujące (uproszczona wersja) kod spowoduje NullPointerException:

Object result = (false) ? false : (false ? true : null); 

Ale:

int val = 2; 
Boolean result = (val == 0) ? Boolean.FALSE : ((val == 1) ? true : null); 

a to:

Object result = (false) ? Boolean.FALSE : (false ? true : null); 

czy to:

Object result = (false) ? (Boolean)false : (false ? true: null); 

nie robi?

+2

'((val == 1)? True: null)' tutaj zmień 'null' na' false' ?? – noMAD

+0

Użyj 'boolean' zamiast' Boolean', aby uniknąć wielu NullPointerExceptions – NINCOMPOOP

+0

@TheNewIdiot To nie robi różnicy dla tego przypadku –

Odpowiedz

-1

w Javie, boolean pozwala tylko true i false ale logiczna pozwala truefalse i NULL

+1

, więc jaki jest powód NPE? – sanbhat

+1

O rany, chciałem, żeby to był komentarz, a nie odpowiedź. @ ___ @ – noMAD

4

myślę, co się dzieje, że ((val == 1) ? true : null) zawsze zwraca null a następnie próbuje unbox że w boolean. To powoduje wyjątek wskaźnika pustego.

Po tym, jak to powiedziałem, @JonSkeet oznaczył twoje pytanie jako duplikat z powodu NullPointerException in ternary expression with null Long Odpowiedź zawiera dużo bardziej szczegółowe wyjaśnienie.

+0

Dlaczego więc zmiana 'false' na' Boolean.FALSE' w przykładzie naprawia NPE? – Jokii

0

int val = 2;

wynik boolowski = (val == o)? fałsz PRAWDA; // usuwa wartość null z kodu i zastępuje ją wartością true.

Powiązane problemy