Троичная оценка Java (немедленная оценка) - PullRequest
26 голосов
/ 11 июня 2009

Я не могу найти соответствующую часть спецификации, чтобы ответить на этот вопрос. В операторе условного оператора в Java оцениваются оба аргумента: истина и ложь?

Так что следующее может выдать исключение NullPointerException

Integer test = null;

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

Ответы [ 3 ]

52 голосов
/ 11 июня 2009

Так как вы хотели спецификацию, вот она (из §15.25 Условный оператор?: , последнее предложение раздела):

Не выбранное выражение операнда не оценивается для этой конкретной оценки условного выражения.

13 голосов
/ 26 февраля 2013

Я знаю, что это старый пост, но посмотрите на очень похожий случай и затем проголосуйте за меня: P

Отвечая на оригинальный вопрос: оценивается только один операнд, НО:

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

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

Этот тест будет выдавать NullPointerException всегда, и в этом случае IF Statemat не эквивалентен?: Operator.

Причина здесь http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.25. Часть о боксе / распаковке запутана, но ее легко понять, посмотрев:

"Если один из второго и третьего операндов имеет тип boolean, а тип другого имеет тип Boolean, то тип условного выражения будет boolean."

То же самое относится к Integer.intValue()

С наилучшими пожеланиями!

9 голосов
/ 11 июня 2009

Нет, не может. Это так же, как:

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