Java 对声纳中先前未引用的值的第114行的状态进行空检

Java 对声纳中先前未引用的值的第114行的状态进行空检,java,sonarlint,Java,Sonarlint,对于下面的代码片段,Sonar向我抛出了一个关键的违规行为-正确性-以前未引用的状态值的空检查 有人能就我做错了什么提出建议吗 代码 实际问题在突出显示的问题后面的一行-您有: 如果(…&&status!=null) 只要拿掉那张支票,我想索纳林特会很高兴的。这是不必要的,因为如果status为null,那么status.getCode()将在达到该条件之前抛出异常 从根本上说,您需要知道getStatus()是否应该返回null—您是否必须显式地处理这种情况。如果您这样做了,您应该在调用st

对于下面的代码片段,Sonar向我抛出了一个关键的违规行为-正确性-以前未引用的状态值的空检查

有人能就我做错了什么提出建议吗

代码

实际问题在突出显示的问题后面的一行-您有:

如果(…&&status!=null)
只要拿掉那张支票,我想索纳林特会很高兴的。这是不必要的,因为如果
status
为null,那么
status.getCode()
将在达到该条件之前抛出异常


从根本上说,您需要知道
getStatus()
是否应该返回null—您是否必须显式地处理这种情况。如果您这样做了,您应该在调用
status.getCode()
之前检查它,并做出相应的反应。如果您不这样做,那么调用
getCode()
方法就可以了-如果您的假设不正确,您将得到一个
NullPointerException
,这可能是“世界并不像我预期的那样”场景中最合适的结果。但是,在您已经依赖于它为非null之后,不应该尝试“处理”它为null。

当从hostResponse.getStatus()接收到它时,status可以为null;因此,当行
String addressMatchCode=status.getCode()时时,可能会导致空引用异常


在调用方法之前,应该先验证所有变量是否为null。

地址匹配码
移动到if条件中,如果条件为null,则检查状态

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;
}

您正在检查
状态!=null,但在您拥有
status.getCode()
之前的行上<代码>状态
在您的if语句中不能为空。虽然您所写的是正确的,但这并不是声纳“投诉”的原因。请参阅Jon Skeet的答案。“在调用方法之前,您应该验证所有变量是否为null。”我强烈不同意这一点。如果
getStatus()
中的返回值被记录为不返回null,那么可以假定它是非null的。。。如果它抛出一个异常,那么就这样吧。不管怎么说,这可能就是您希望显式检查所做的:“系统没有按照我预期的那样运行。惊慌失措!”SonarLint抱怨的原因是代码在其运行过程中不一致。
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;
}