(Удивительно) краткий ответ: Затмение верно!Это мертвый код!
Причина
Важной частью является троичное выражение в следующей строке кода:
Integer rowIndex = (keyValue == null) ? 0 : keyValueToRowIndex.get(keyValue);
Спецификация языка Java (JLS) говорит о «Условном операторе?» , что, если первое выражение имеет тип int
, а второе выражение имеет тип Integer
, тип всего выражения будет int
.
В вашем случае первое выражение - это константное литеральное значение 0
, которое является int
.Второе выражение является результатом метода get
, который возвращает объект типа Integer
.Таким образом, согласно JLS, все выражение имеет примитивный тип int
!
Это означает, что если будет вычислено второе выражение (get
-call), результат будет распакован с 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);