SonarQube — может быть вызвано исключение NullPointerException;

#java #sonarqube #sonarqube-scan

#java #sonarqube #sonarqube-сканирование

Вопрос:

SonarQube сообщает мне об этой ошибке: A "NullPointerException" could be thrown; "getBody()" can return null.

Это код:

 if (holdingResponseEntity == null || holdingResponseEntity.getBody() == null || holdingResponseEntity.getBody().getError() || holdingResponseEntity.getBody().getResult() == null) { throw new HoldingNotFoundException("Holding whit id="   idHolding   " not found-"); }
 

Ответ №1:

Сначала вы проверяете, возвращает ли getBody() возврат null .

SonarQube видит это и думает, что метод может возвращать значение null.

Затем вы снова вызываете тот же метод. SonarQube просто знает, что метод может возвращать значение null, поэтому сообщает вам предупреждение.

Другими словами, SonarQube считает, что он может вернуть что-то другое, чем null в первый раз, но вернуть null во второй раз.

Если метод является простым средством получения и объект не изменяется одновременно, это не проблема.

Чтобы удалить предупреждение, вы можете выполнить одно из следующих действий:

  • Сохраните результат getBody() в переменной, проверьте, имеет ли она значение null, и продолжите, если это не так
  • Добавьте //NOSONAR комментарий, сообщающий SonarQube, что вы знаете, что делаете.

Обратите внимание, что вы можете объяснить, почему это нормально, в комментарии, если вы решите для второго случая.

Ответ №2:

Теоретически может быть так, что повторный вызов getBody() может вернуть другое значение. Следующее использует hasBody() и вызывает getBody() только один раз.

 if (holdingResponseEntity == null
        || !holdingResponseEntity.hasBody()) {
    throw new HoldingNotFoundException("Holding with id="   idHolding   " not found.");
}
T body = holdingResponseEntity.getBody(); // Change T appropriately.
if (body.getError() || body.getResult() == null) {
    throw new HoldingNotFoundException("Holding with id="   idHolding   " not found.");
}
 

Обычно вы должны проверить исходный код библиотеки getBody . Мое предположение: это не простой геттер, а интерпретирует тело один раз. Потому что есть hasBody .

Такие вещи делают проверку кода полезной.

Ответ №3:

Однако есть и другие способы решить эту проблему, как указано выше, но если я хочу решить ее так, как вы написали код с минимальными изменениями, и избежать предупреждения от Sonar, это будет, как показано ниже —

Использование оператора amp;amp; гарантирует, что после сбоя условия оно не будет проверять последующее условие, и это решает проблему.

 if(holdingResponseEntity != null amp;amp;
                holdingResponseEntity.getBody() != null amp;amp;
                holdingResponseEntity.getBody().getError() != null amp;amp;
                holdingResponseEntity.getBody().getResult() != null){
           //Everything is good if it comes here

        }else{
            System.out.println("Going to throw ***** ");
            throw new HoldingNotFoundException("Holding whit id="   idHolding   " not found-");
        }