Мой тернарный оператор выдает NullPointerException
, хотя я явно проверяю, равно ли значение моего списка null
. Однако, если я добавлю круглые скобки вокруг тернарного оператора, мой код будет работать.
Код без круглых скобок (генерация исключения):
final List<String> listData = null;
System.out.println("Insert new data (Created Monitorings) : " +
listData != null ? listData.size() : 0);
Код со скобками (работает нормально):
final List<String> listData = null;
System.out.println("Insert new data (Created Monitorings) : " +
(listData != null ? listData.size() : 0));
Может кто-нибудь объяснить, как именно это работает.
@GhostCat Да!!! Спасибо :)
в первом фрагменте значение, которое сравнивается с нулем, равно "Insert new data (Created Monitorings) : " + listData
Речь идет о приоритет операторов: String+
имеет гораздо более высокий приоритет, чем следующий тернарный оператор.
Поэтому ваш первый фрагмент на самом деле делает это:
( "Insert new data (Created Monitorings) : " + listData ) != null
? listData.size() : 0
Значение: вы объединяете строку (с нулем listData
) и сравниваете ее с нулем. Очевидно, что эта объединенная строка не равна нулю. Таким образом, вы вызываете listData.size()
. И это похоже на null.size()
, что приводит к исключению NullPointerException.
Вы сравниваете неправильно с нулевым значением! Во втором фрагменте (круглые скобки) убедитесь, что результат троичной операции будет добавлен в вашу строку.
'+' имеет больший приоритет, чем '!='
Следовательно, фрагмент 1 переводится как:
(("Вставить новые данные (Созданные мониторинги): " + listData) != null ? listData.size() : 0;
Выражение не равно null, поэтому оно переходит к listData.size(). Но поскольку он равен нулю, он выдает исключение.
NullPointerException не является ошибкой компиляции