Почему я получаю исключение NullPointerException в моем троичном операторе? - PullRequest
4 голосов
/ 22 мая 2019

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

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

Ответы [ 3 ]

8 голосов
/ 22 мая 2019

Это примерно приоритет операторов: строка + имеет гораздо более высокий приоритет, чем следующий троичный оператор.

Поэтому ваш первый фрагмент фактически делает это:

( "Insert new data (Created Monitorings) : " + listData ) != null 
  ? listData.size() : 0

Значение: вы объединяете строку (с нулем listData) и сравниваете ее с нулем. Очевидно, что конкатированная строка не равна нулю. Таким образом, вы звоните listData.size(). И это похоже на null.size(), что приводит к вашему NullPointerException.

Вы сравниваете неправильную вещь с нулем! Во втором фрагменте (круглые скобки) убедитесь, что результат троичной операции будет добавлен в вашу строку.

1 голос
/ 22 мая 2019

во фрагменте 1 значение, которое сравнивается со значением NULL, равно "Insert new data (Created Monitorings) : " + listData

0 голосов
/ 22 мая 2019

'+' имеет больший приоритет, чем '! ='

Следовательно, фрагмент 1 преобразуется в:

( ("Вставить новые данные (созданные наблюдения):" + listData)! = Null? ListData.size (): 0;

Выражение не равно нулю, поэтому оно переходит к listData.size (). Но так как оно равно null, оно выдает исключение.

...