Нулевые указатели SonarQube не должны разыменовываться при попытке / улове - PullRequest
2 голосов
/ 27 июня 2019

В настоящее время я работаю с SonarQube, решая проблемы, но сталкиваюсь с проблемой, связанной с обработкой нулевых указателей, которые не должны быть разыменованы.Эта проблема отображается sonarqube.

Моя основная проблема заключается в том, что я делаю restTemplate.exchange с try-catch и объявляю переменную со значением NULL перед предложением предложения, а затем использую его внутри try.Наконец, мой метод возвращает ответ со значением restTemplate.

public MyDto exchangeUrlRequest(String url){
 ResponseEntity<MyDto> responseDto = null;
 try{
  responseDto = restTemplate.exchange(url, HttpMethod.PUT...
 }catch(HttpClientErrorException e){
   //some code here
 }
  return responseDto.getBody();
}

Ожидаемый результат - решить проблему с sonarqube.Как не удалось инициализировать «responseDto» без «null», потому что это вызывает проблему с сонаром.

Я уже пытался поместить "ResponseEntity responseDto" в мое предложение try, назначая и возвращая соответствующее значение, но обязательно возвращать что-то из try / catch.Поставить «новый ResponseEntity» неправильно, потому что я не буду знать, каким будет ответ за статус http.

1 Ответ

0 голосов
/ 27 июня 2019

Ваш код должен что-то делать с возможным NullPointerException при обнаружении какого-либо исключения, потому что в этом сценарии responseDto будет нулевым.

Есть много способов решить эту проблему.Решение, которое я рекомендую, не работает с null возвратами или переменными на Java, попробуйте избегать этого.Вместо этого вы можете использовать Optional.

Итак, этот код должен решить проблему с сонаром:

public Optional<MyDto> exchangeUrlRequest(String url){

     ResponseEntity<MyDto> responseDto;
     try{
          responseDto = restTemplate.exchange(url, HttpMethod.PUT...);
     } catch(HttpClientErrorException e) {
         //some code here
     }

     if (responseDto == null) {
         return Optional.empty();
     } 
     return Optional.of(responseDto.getBody());
}

Вы также можете отменить проверку null, используя Optional<ResponseEntity<MyDto>>, например:

public Optional<MyDto> exchangeUrlRequest(String url){

     Optional<ResponseEntity<MyDto>> optResponseDto = Optional.empty();
     try{
          optResponseDto = Optional.of(restTemplate.exchange(url, HttpMethod.PUT...));
     } catch(HttpClientErrorException e) {
         //some code here
     }

     if (!optResponseDto.isPresent()) {
         return Optional.empty();
     } 
     return optResponseDto.get().getBody();
}

Даже я не рекомендую это, вы можете просто проверить ноль responseDto без использования Optional:

public Optional<MyDto> exchangeUrlRequest(String url){

     ResponseEntity<MyDto> responseDto = null;
     try{
          responseDto = restTemplate.exchange(url, HttpMethod.PUT...);
     } catch(HttpClientErrorException e) {
         //some code here
     }

     if (responseDto == null) {
         return null;
     } 
     return responseDto.getBody();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...