SonarLint дляOptional.ofNullable: может быть выброшено исключение NullPointerException

Я получаю предупреждение сонара A "NullPointerException" could be thrown; "test" is nullable here. в состоянии if:

public record Test(String x) {
  public static void main(String[] args) {
    Test test = new Test("x");
    printXLength(test);
  }

  private static void printXLength(Test test) {
    if (Optional.ofNullable(test).map(test1 -> test1.x).isPresent()) {
      System.out.println(test.x.length());
    }
  }
}

Я установил для тестовой переменной значение null и запустил ее, NPE не выдало.

Это ложное срабатывание? Или я что-то упускаю?

Можете ли вы показать код для тестирования с Null? если параметр test равен нулю, test1.x выдаст NPE

BDurand 15.08.2024 10:56

вы можете установить свойство x тестового объекта как необязательное.

BDurand 15.08.2024 10:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этой строке:

if (Optional.ofNullable(test).map(test1 -> test1.x).isPresent())

вызов isPresent() не проверяет наличие test напрямую; он проверяет, присутствует ли результат вызова map — следовательно, он проверяет наличие test только косвенно. Sonarlint недостаточно умен, чтобы просмотреть весь поток данных и определить, что test здесь не может быть нулевым.

Попробуйте изменить его на следующее:

  private static void printXLength(Test test) {
    Optional.ofNullable(test).map(test1 -> test1.x).ifPresent(
      x -> System.out.println(x.length())
    )
  }

ламба-код работает, но означает ли это, что я не могу использовать Optional.ofNullable с if и должен вернуться к традиционной проверке нуля: if (test != null && test.x() != null)?

was_777 15.08.2024 11:04

Если вы хотите использовать if (...isPresent()), вам придется отключить проверку SonarLint, воспользовавшись комментарием //NOSONAR

k314159 15.08.2024 11:12

так что в основном эта проблема является ложным срабатыванием?

was_777 15.08.2024 11:13

Это можно было бы назвать ложным срабатыванием, хотя было бы несправедливо ожидать, что Sonar это выяснит.

k314159 15.08.2024 11:15

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