Проблема возникла из-за того, что tidyverse
имеет системные зависимости (т. е. libcurl4-openssl-dev
, libssl-dev
, libxml2-dev
). Я написал сообщение в блоге , в котором более подробно объясняется это решение.
Тернарные выражения, как и любое выражение, имеют тип, который определяется компилятором. Если две стороны тройного выражения имеют то, что выглядит как разные типы, тогда компилятор попытается найти общий базовый тип, используя наименее двусмысленные два варианта. В вашем случае -1
является наименее неоднозначным, поэтому тип тройного выражения int
. К сожалению, компилятор не использует вывод типа на основе принимающей переменной.
Затем выражение rsrqs.get(boxedPci.toString())
затем вычисляется и принудительно вводится в тип int
для соответствия тернарному выражению, но поскольку это null
он бросает NPE.
По боксу -1
значение тройного выражения Integer
, и поэтому вы несетевой.
Ну, Integer.valueOf(String)
возвращает Integer
, а -1 - примитив int
. Первый пример принудительно распаковывается, потому что один термин является примитивным. Вы также могли бы использовать
Integer boxedRsrq = boxedPci != null ?
rsrqs.get(boxedPci.toString()) : (Integer) -1;
, который имел бы коробку -1.
Объяснение можно сделать из информации в спецификации g0 java language: 15.25. Условный оператор? : .
Из таблицы вы получаете информацию о том, что если второй операнд (rsrqs.get(boxedPci.toString())
) имеет тип Integer
, а третий операнд имеет тип int
, результат будет иметь тип int
.
Это означает, что
Integer boxedRsrq = boxedPci != null ? rsrqs.get(boxedPci.toString()) : -1;
семантически совпадает с
Integer boxedRsrq = boxedPci != null ? ((int)rsrqs.get(boxedPci.toString())) : -1;
. Но это означает, что вы получаете NullPointerException
, если вы получаете null
с карты, что, очевидно, происходит.
Если вы передадите третий операнд в Integer
, второй операнд никогда не будет передан в int
, и NPE не происходит.
1
- это int, а не целое число. Таким образом, Java собирается удалить ядро Integer с int, что вызывает исключение NullPointerException. Когда вы автоматически удаляете нулевое целое число, это приводит к исключению NullPointerException. ( здесь )
Но когда вы используете
Integer.valueOf(-1)
, ему не нужно автоматически распаковывать его, что не приводит к исключениям.