2009-06-10 9 views
22

Nie mogę znaleźć odpowiedniej części specyfikacji, aby odpowiedzieć na to pytanie. W warunkowej instrukcji operatora w Javie są obliczane zarówno prawdziwe, jak i fałszywe argumenty?Ternary Java (natychmiastowe jeśli) ocena

Można więc dodaje rzucać NullPointerException

Integer test = null; 

test != null ? test.intValue() : 0; 
+3

Jest to również dość proste, że można po prostu wypróbować i zobaczyć, co się stanie :) –

+7

Co daje informacje na temat jednej konkretnej instancji. Lepiej znaleźć to, co mówi standard. –

Odpowiedz

43

Ponieważ chciał spec, to jest tutaj (z §15.25 Conditional Operator ? : ostatnie zdanie sekcji):

The operand expression not chosen is not evaluated for that particular evaluation of the conditional expression.

8

Nie, to nie dało. To tak samo jak:

Integer test = null; 
if (test != null) { 
    test = test.intValue(); 
} 
else { 
    test = 0; 
} 
0

składnia jest źle.

Integer test = (test! = Null)? test.intValue(): 0;

nadzieję, że to pomaga ....

+1

Deklarowanie i odwoływanie się do zmiennej w tej samej linii? * "Błąd: zmienna' test' mogła nie zostać zainicjalizowana "* – Pang

7

Wiem, że to stary post, ale wygląda na bardzo podobnej sprawie, a następnie głosować mnie: P

Odpowiadając na oryginalne pytanie: tylko jeden operand jest oceniany ALE:

@Test 
public void test() 
{ 
    Integer A = null; 
    Integer B = null; 

    Integer chosenInteger = A != null ? A.intValue() : B;  
} 

Ten test zawsze będzie rzutował NullPointerException iw tym przypadku statystyki IF nie są równoważne operatorowi?:.

Powód jest tutaj http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.25. Część o boks/unboxing jest uwikłany, ale może być łatwo zrozumiałe patrząc na:

"If one of the second and third operands is of type boolean and the type of the other is of type Boolean , then the type of the conditional expression is boolean ."

To samo odnosi się do Integer.intValue()

Pozdrawiam!

+2

Interesujący punkt, dzięki Michał. Ponieważ A.intValue() jest typu int, odwołanie do B musi być automatycznie rozpakowane. Ale jest zerowy, więc rzuca NPE. W Javie 8/Eclipse Luna z włączoną analizą null ten test nawet się nie kompiluje! –