Обнуление статуса в строке 114 значения, ранее разыменованного в Sonar - PullRequest
4 голосов
/ 27 мая 2020

Для приведенного ниже фрагмента кода Sonar выдает мне критическое нарушение - Корректность - Проверка нуля ранее разыменованного значения статуса

Может ли кто-нибудь предложить по этому поводу, что я здесь делаю не так?

code

public boolean isExactMacthBill(AddressResponse response) {
        boolean exactMatch = false;
        if (null != response && null != response.getHostResponse()) {
            HostResponseDetail hostResponse = response.getHostResponse();
            String addressStatus = hostResponse.getMatchStatus();
            ResponseDetail status = hostResponse.getStatus();
            String addressMatchCode = status.getCode();
            if (null != response.getMatchedAddresses() && response.getMatchedAddresses().size() > 0 && status != null) {
                if (addressStatus.equalsIgnoreCase(Constants.USPS_MATCH)
                        || (addressStatus.equalsIgnoreCase(Constants.PARTIAL_MATCH)
                                && addressMatchCode.equalsIgnoreCase("3SXU"))) {
                    exactMatch = true;
                } else
                    exactMatch = false;
            }
        }
        return exactMatch;
    }

enter image description here

Ответы [ 3 ]

5 голосов
/ 27 мая 2020

Настоящая проблема находится в строке после выделенной - у вас есть:

if (... && status != null)

Просто удалите этот флажок, и я думаю, что SonarLint будет счастлив. В этом нет необходимости, потому что, если status имеет значение null, то status.getCode() уже вызовет исключение, прежде чем вы достигнете этого условия.

По сути, вам нужно знать, должен ли getStatus() когда-либо return null - нужно ли вам явно обрабатывать эту ситуацию. Если вы это сделаете, вы должны проверить перед вашим звонком на status.getCode() и отреагировать соответствующим образом. Если вы этого не сделаете, можно вызвать метод getCode() - если ваше предположение неверно, вы получите NullPointerException как обычно, что, вероятно, является наиболее подходящим результатом для сценария «мир не как я и ожидал ". Но вы не должны пытаться «обработать» его нулевым значением после того, как вы уже зависели от него.

1 голос
/ 27 мая 2020

статус может быть нулевым, если он получен от hostResponse.getStatus();; поэтому, когда вызывается строка String addressMatchCode = status.getCode();, это может привести к исключению нулевой ссылки.

Вы должны проверить все переменные, если есть null, прежде чем вызывать для них методы.

0 голосов
/ 27 мая 2020

Переместите свой addressMatchCode в условие if, которое не проверяет статус.

public boolean isExactMacthBill(AddressResponse response) {
    boolean exactMatch = false;
    if (null != response && null != response.getHostResponse()) {
        HostResponseDetail hostResponse = response.getHostResponse();
        String addressStatus = hostResponse.getMatchStatus();
        ResponseDetail status = hostResponse.getStatus();

        if (null != response.getMatchedAddresses() && response.getMatchedAddresses().size() > 0 && status != null) {
            String addressMatchCode = status.getCode();
            if (addressStatus.equalsIgnoreCase(Constants.USPS_MATCH)
                    || (addressStatus.equalsIgnoreCase(Constants.PARTIAL_MATCH)
                            && addressMatchCode.equalsIgnoreCase("3SXU"))) {
                exactMatch = true;
            } else
                exactMatch = false;
        }
    }
    return exactMatch;
}
...