Java 对声纳中先前未引用的值的第114行的状态进行空检
对于下面的代码片段,Sonar向我抛出了一个关键的违规行为-正确性-以前未引用的状态值的空检查 有人能就我做错了什么提出建议吗 代码Java 对声纳中先前未引用的值的第114行的状态进行空检,java,sonarlint,Java,Sonarlint,对于下面的代码片段,Sonar向我抛出了一个关键的违规行为-正确性-以前未引用的状态值的空检查 有人能就我做错了什么提出建议吗 代码 实际问题在突出显示的问题后面的一行-您有: 如果(…&&status!=null) 只要拿掉那张支票,我想索纳林特会很高兴的。这是不必要的,因为如果status为null,那么status.getCode()将在达到该条件之前抛出异常 从根本上说,您需要知道getStatus()是否应该返回null—您是否必须显式地处理这种情况。如果您这样做了,您应该在调用st
实际问题在突出显示的问题后面的一行-您有:
如果(…&&status!=null)
只要拿掉那张支票,我想索纳林特会很高兴的。这是不必要的,因为如果status
为null,那么status.getCode()
将在达到该条件之前抛出异常
从根本上说,您需要知道
getStatus()
是否应该返回null—您是否必须显式地处理这种情况。如果您这样做了,您应该在调用status.getCode()
之前检查它,并做出相应的反应。如果您不这样做,那么调用getCode()
方法就可以了-如果您的假设不正确,您将得到一个NullPointerException
,这可能是“世界并不像我预期的那样”场景中最合适的结果。但是,在您已经依赖于它为非null之后,不应该尝试“处理”它为null。当从hostResponse.getStatus()接收到它时,status可以为null代码>;因此,当行String addressMatchCode=status.getCode()时调用code>时,可能会导致空引用异常
在调用方法之前,应该先验证所有变量是否为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;
}