2009-06-10 8 views
22

Non riesco a trovare la parte pertinente della specifica per rispondere a questa domanda. In un'istruzione dell'operatore condizionale in Java, vengono valutati sia gli argomenti vero che falso?Valutazione ternaria Java (immediata se)

Così potrebbe seguito gettare un NullPointerException

Integer test = null; 

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

È anche qualcosa di abbastanza semplice da poter provare e vedere cosa succede :) –

+7

Che fornisce informazioni su una particolare istanza. Meglio trovare quello che dice lo standard. –

risposta

43

Dal momento che si voleva le specifiche, qui è (dal §15.25 Conditional Operator ? :, l'ultima frase della sezione):

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

8

No, non poteva. Questo è lo stesso di:

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

la sintassi è sbagliata.

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

Speranza che aiuta ....

+1

Dichiarazione e riferimento della variabile sulla stessa linea? * "Errore: variabile' test' potrebbe non essere stata inizializzata "* – Pang

7

so che è vecchio post, ma guarda caso molto simile e poi mi votare: P

Rispondendo alla domanda originale: un solo operando viene valutato MA:

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

    Integer chosenInteger = A != null ? A.intValue() : B;  
} 
@Test 
public void test() 
{ 
    Integer A = null; 
    Integer B = null; 

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

Questo test genererà NullPointerException sempre e in questo caso IF statemat non equivale a?: Operator.

Il motivo è qui http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.25. La parte sulla boxe/unboxing è coinvolto, ma può essere facilmente comprensibile guardando:

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

Lo stesso vale per Integer.intValue()

i migliori saluti!

+2

Punto interessante, grazie Michal. Poiché A.intValue() è di tipo int, il riferimento a B deve essere unbox automatico. Ma è nullo, quindi lancia NPE. In Java 8/Eclipse Luna con analisi nulla attivata, questo test non viene nemmeno compilato! –