如何修复Sonar代码异味:get()返回空可能引发空指针异常
修复Sonar检测的空指针异常代码异味问题
问题原因
Sonar提示的空指针风险出现在直接对request.getHeaders().get(HttpHeaders.CUSTOMER_ID.getName())调用.isEmpty()的代码行——如果get()方法返回null,后续调用.isEmpty()会直接抛出空指针异常。另外原代码中==nul是拼写错误,应为==null。
修复方案
方案1:提取变量(最直观的基础修复)
将get()的结果提取为局部变量,避免重复调用并安全判断null:
// 提取header值到变量,仅调用一次get() String customerIdHeader = request.getHeaders().get(HttpHeaders.CUSTOMER_ID.getName()); // 先判断null,再判断空字符串,避免空指针 if (customerIdHeader == null || customerIdHeader.isEmpty()) { String customer_id = LogContext.getCustomerId(); if (customer_id != null) { request.getHeaders().add(HttpHeaders.CUSTOMER_ID.getName(), customer_id); } }
方案2:使用工具类简化判断(推荐)
如果项目依赖Apache Commons Lang或Spring Core,可以用工具类的isEmpty()方法,它会同时处理null和空字符串:
// 以Spring的StringUtils为例,Apache Commons的StringUtils用法一致 import org.springframework.util.StringUtils; if (StringUtils.isEmpty(request.getHeaders().get(HttpHeaders.CUSTOMER_ID.getName()))) { String customer_id = LogContext.getCustomerId(); if (customer_id != null) { request.getHeaders().add(HttpHeaders.CUSTOMER_ID.getName(), customer_id); } }
方案3:Java 8+ Optional方式
用Optional包装可能为null的对象,通过链式调用安全判断:
Optional<String> customerIdHeader = Optional.ofNullable(request.getHeaders().get(HttpHeaders.CUSTOMER_ID.getName())); if (!customerIdHeader.isPresent() || customerIdHeader.get().isEmpty()) { String customer_id = LogContext.getCustomerId(); if (customer_id != null) { request.getHeaders().add(HttpHeaders.CUSTOMER_ID.getName(), customer_id); } }
更简洁的写法:
if (Optional.ofNullable(request.getHeaders().get(HttpHeaders.CUSTOMER_ID.getName())) .map(String::isEmpty) .orElse(true)) { String customer_id = LogContext.getCustomerId(); if (customer_id != null) { request.getHeaders().add(HttpHeaders.CUSTOMER_ID.getName(), customer_id); } }
核心思路
所有方案的核心都是避免在可能为null的对象上直接调用实例方法,通过提取变量复用结果、工具类封装判断逻辑或Optional容器安全处理null值,同时修正原代码中的拼写错误。
内容的提问来源于stack exchange,提问作者Susil Ku Padhi
相关产品推荐
相关产品推荐

