NPE при запуске в тройном операторе [дубликат]

Проблема возникла из-за того, что tidyverse имеет системные зависимости (т. е. libcurl4-openssl-dev, libssl-dev, libxml2-dev). Я написал сообщение в блоге , в котором более подробно объясняется это решение.

17
задан Pavlo 21 August 2014 в 12:11
поделиться

4 ответа

Тернарные выражения, как и любое выражение, имеют тип, который определяется компилятором. Если две стороны тройного выражения имеют то, что выглядит как разные типы, тогда компилятор попытается найти общий базовый тип, используя наименее двусмысленные два варианта. В вашем случае -1 является наименее неоднозначным, поэтому тип тройного выражения int. К сожалению, компилятор не использует вывод типа на основе принимающей переменной.

Затем выражение rsrqs.get(boxedPci.toString()) затем вычисляется и принудительно вводится в тип int для соответствия тернарному выражению, но поскольку это null он бросает NPE.

По боксу -1 значение тройного выражения Integer, и поэтому вы несетевой.

25
ответ дан skaffman 23 August 2018 в 20:42
поделиться

Ну, Integer.valueOf(String) возвращает Integer, а -1 - примитив int. Первый пример принудительно распаковывается, потому что один термин является примитивным. Вы также могли бы использовать

Integer boxedRsrq = boxedPci != null ? 
    rsrqs.get(boxedPci.toString()) : (Integer) -1;

, который имел бы коробку -1.

3
ответ дан Elliott Frisch 23 August 2018 в 20:42
поделиться

Объяснение можно сделать из информации в спецификации 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 не происходит.

10
ответ дан fabian 23 August 2018 в 20:42
поделиться
1

- это int, а не целое число. Таким образом, Java собирается удалить ядро ​​Integer с int, что вызывает исключение NullPointerException. Когда вы автоматически удаляете нулевое целое число, это приводит к исключению NullPointerException. ( здесь )

Но когда вы используете

 Integer.valueOf(-1) 

, ему не нужно автоматически распаковывать его, что не приводит к исключениям.

3
ответ дан NV Bhargava 23 August 2018 в 20:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: