Ошибка сонара «Возможное разыменование нулевого указателя» почти при каждом вызове метода

#java #sonarqube

#java #sonarqube

Вопрос:

Я извлекаю некоторые данные из удаленной службы, используя Spring RestTemplate:

 ResponseEntity<....> result = restTemplate.exchange(....);
  

… и затем я использую результат для дальнейшей обработки, и, следовательно, я вызываю для него различные методы, например:

 result.getHeaders().getContentType().getType()
result.getBody()
result.getHeaders().getContentType().getSubtype()
  

Сонару не нравится этот код, и он сообщает об ошибке «Возможное разыменование нулевого указателя» почти при всех вызовах этих методов. Кажется, мне нужно иметь нулевую проверку почти для каждого возвращаемого значения.

Это делает мой код слишком большим количеством нулевых проверок.

Можно ли этого избежать?

Комментарии:

1. Да, отключите проверку

2. Это не в моей власти. Его настройка уровня команды.

3. Затем убедитесь, что вы преждевременно избегаете NPE.

Ответ №1:

Использование Optional из java 8 JavaDocs:

 String contentType = Optional.ofNullable(result)
  .map(HttpResponse::getHeaders)
  .map(Headers::getContentType)
  .map(ContentType::getType)
  .orElse(null);
  

HttpResponse должен быть тип result , Headers должен быть возвращаемый тип getHeaders() и так далее.

Вы можете использовать другие завершающие операторы, отличные от orElse() :

 .orElseGet(() -> someOtherProcess());
.orElseThrow(() -> new RuntimeException("Content Type was Null"));