有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Nullcheck检查先前在Sonar中取消引用的值的第114行的状态

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

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

代码

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) 个答案

  1. # 1 楼答案

    实际问题在突出显示的问题后的行中-您得到:

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

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

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

  2. # 2 楼答案

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

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

  3. # 3 楼答案

    addressMatchCode移动到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;
    }