SonarQube提示existingValues存在空指针异常,求代码修复方案
问题分析与修复方案
问题根源
SonarQube提示的NPE风险来自三个关键点:
Double.compare()接收的是基本类型double参数,如果existingValues.conFactor或updatedValues.conFactor是Double包装类且为null,自动拆箱时会直接抛出NullPointerException。- 代码里存在变量名笔误:
existingValue.url应该是existingValues.url,少了个s,这也是潜在的NPE触发点。 - 原逻辑表达式嵌套过多,可读性差,容易引发逻辑错误。
修复步骤
- 处理Double类型的null判断:用
Objects.equals()替代Double.compare()比较包装类Double,它会自动处理null场景(两个都为null时返回true,一个为null一个不为null返回false)。 - 修正变量名笔误:把
existingValue改成existingValues。 - 简化逻辑表达式:原表达式
!(Double.compare(...) !=0)等价于Double.compare(...) ==0,结合||逻辑转换为更直观的判断逻辑。
修复后的代码
import java.util.Objects; boolean shouldPublish(YourType existingValues, YourType updatedValues) { if (existingValues == null) { return false; } // 判断conFactor是否相等,或url是否不等,满足任一条件则返回true boolean conFactorEquals = Objects.equals(existingValues.conFactor, updatedValues.conFactor); boolean urlNotEquals = !Objects.equals(existingValues.url, updatedValues.url); return conFactorEquals || urlNotEquals; }
额外说明
如果业务场景必须使用Double.compare(),需要手动提前判断null:
boolean conFactorEquals; if (existingValues.conFactor == null && updatedValues.conFactor == null) { conFactorEquals = true; } else if (existingValues.conFactor != null && updatedValues.conFactor != null) { conFactorEquals = Double.compare(existingValues.conFactor, updatedValues.conFactor) == 0; } else { conFactorEquals = false; }
但显然Objects.equals()的写法更简洁高效,同时也规避了NPE风险。另外对url的比较也用Objects.equals(),可以避免existingValues.url为null时调用equals()抛NPE。
内容的提问来源于stack exchange,提问作者Mausumi
相关产品推荐
相关产品推荐

