解析JSON文件时如何安全处理不存在的对象以避免空指针异常
解决JSON解析时的NullPointerException问题
我来帮你搞定这个空指针的问题,咱们先拆解下问题根源,再一步步给出修复方案:
问题出在哪?
你代码里的判断逻辑if (feature.getVulnerabilities().equals(" ") || feature.getVulnerabilities().isEmpty() || feature.getVulnerabilities().size() == 0)有两个明显的问题:
- 如果
feature.getVulnerabilities()返回null,直接调用equals()/isEmpty()/size()会立刻触发NullPointerException; equals(" ")完全无效——vulnerabilities是List类型,和字符串比较永远不相等,这部分判断纯属多余。
解决方案
这里有几个递进的方案,你可以根据自己的场景选择:
方案1:先判空再操作(快速临时修复)
在调用List的任何方法前,先检查是否为null,修改后的代码如下:
for (Feature feature : featureList) { System.out.println("Feature name :" + feature.getName()); List<Vulnerability> vulns = feature.getVulnerabilities(); // 先判断null,再判断集合是否为空 if (vulns == null || vulns.isEmpty()) { System.out.println("no vulnerability found"); } else { System.out.println("------------------------------------------------------------"); for (Vulnerability vulnerability : vulns) { System.out.println(" === Vulnerabilities === "); System.out.println("CVE: " + vulnerability.getName()); System.out.println("Namespace: " + vulnerability.getNamespaceName()); } } }
这个改动直接避免了null时调用方法导致的NPE,同时去掉了无效的字符串比较逻辑。
方案2:在POJO中初始化空集合(从根源避免null)
更优雅的方式是在Feature类里直接把vulnerabilities初始化为空集合,这样Jackson解析时即使JSON里没有这个字段,也不会返回null:
public class Feature { // 其他字段... // 初始化空集合,从根源避免null private List<Vulnerability> vulnerabilities = new ArrayList<>(); public List<Vulnerability> getVulnerabilities() { return vulnerabilities; } // 可选:setter里也做一层非空判断,防止外部传入null public void setVulnerabilities(List<Vulnerability> vulnerabilities) { this.vulnerabilities = vulnerabilities == null ? new ArrayList<>() : vulnerabilities; } }
这样你的业务代码里就不需要再判断null了,直接调用isEmpty()即可,逻辑会简洁很多。
方案3:用Jackson注解自动处理null(推荐)
如果你用的是Jackson 2.9及以上版本,可以用@JsonSetter注解让Jackson自动把null或不存在的字段转为空集合:
import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; public class Feature { // 其他字段... private List<Vulnerability> vulnerabilities; @JsonSetter(nulls = Nulls.AS_EMPTY) public void setVulnerabilities(List<Vulnerability> vulnerabilities) { this.vulnerabilities = vulnerabilities; } public List<Vulnerability> getVulnerabilities() { return vulnerabilities; } }
这个注解会告诉Jackson:当解析到vulnerabilities字段为null,或者JSON里根本没有这个字段时,自动设置为空的List。从解析层面解决问题,业务代码完全不需要关心null的情况。
总结
推荐使用方案2或方案3,这两种方式从根源上避免了null的出现,让代码更简洁、更健壮。方案1适合快速临时修复,但长期来看还是前两种方式更优。
内容的提问来源于stack exchange,提问作者SyCode
相关产品推荐
相关产品推荐

