Fefer_Ivan's blog

By Fefer_Ivan, 10 years ago, In Russian

Добрый день.

Сегодня я разбирался с NullPointerException, возникающим в API в крайне непонятном месте, и обнаружил, что следующий код ведет себя странно.

long a = 0; // primitive long
Long b = null; // Long object
boolean s = ???;

Long c = s ? a : b;

Выяснилось, что s ? a : b эквивалентно s ? a : (throw new NullPointerException). И связано это с тем, что выражение s ? a : b имело тип long, а не Long и так как переменная b имела значение null, то при попытке привести её к типу long возникал NPE. Такие дела. Баг я поправил так

Long c = s ? Long.valueOf(a) : b;

С уважением, Иван.

P.S.
Все как и написано в спецификации:

  • If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion (§5.1.7) to T, then the type of the conditional expression is T.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.25

  • Vote: I like it
  • +45
  • Vote: I do not like it