Короткий (удивительный) ответ: Затмение верно! Это мертвый код!
Причина
Важной частью является тернарное выражение в следующей строке кода:
Integer rowIndex = (keyValue == null) ? 0 : keyValueToRowIndex.get(keyValue);
В спецификации языка Java (JLS) говорится о "Условный оператор?", если первое выражение имеет тип int
, а второе выражение имеет тип Integer
, тип всего выражения будет int
.
В вашем случае первое выражение представляет собой постоянное буквальное значение 0
, которое равно int
. Второе выражение является результатом метода get
, который возвращает объект типа Integer
. Итак, согласно JLS, все выражение имеет примитивный тип int
!
Это означает, что если будет оцениваться второе выражение (вызов get
), результат будет распакован с Integer
на int
. Затем это значение int
будет снова автоматически упаковано в Integer
, чтобы его можно было присвоить левому операнду rowIndex
.
Но что произойдет, если карта вернет значение null
? В этом случае распаковка с Integer
на int
невозможна, и будет выброшен NullPointerExpression
!
Итак, затмение верно, поскольку ваше выражение никогда не может вернуть null
, rowIndex
также никогда не будет null
, а блок then вашего оператора if никогда не будет выполнен и, следовательно, является мертвым кодом!
Решение
Решение простое: используйте объект Integer
вместо примитивного значения int
для вашего первого выражения:
Integer rowIndex = (keyValue == null) ? Integer.valueOf(0) : keyValueToRowIndex.get(keyValue);
person
isnot2bad
schedule
15.10.2018