Почему я получаю исключение NullPointerException в своем тернарном операторе?

Мой тернарный оператор выдает 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));

Может кто-нибудь объяснить, как именно это работает.

NullPointerException не является ошибкой компиляции

Sharon Ben Asher 22.05.2019 13:19

@GhostCat Да!!! Спасибо :)

Pramendra Raghuwanshi 04.06.2019 12:51
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
4
2
107
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

в первом фрагменте значение, которое сравнивается с нулем, равно "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(). Но поскольку он равен нулю, он выдает исключение.

Другие вопросы по теме