You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析JSON文件时如何安全处理不存在的对象以避免空指针异常

解决JSON解析时的NullPointerException问题

我来帮你搞定这个空指针的问题,咱们先拆解下问题根源,再一步步给出修复方案:

问题出在哪?

你代码里的判断逻辑if (feature.getVulnerabilities().equals(" ") || feature.getVulnerabilities().isEmpty() || feature.getVulnerabilities().size() == 0)有两个明显的问题:

  1. 如果feature.getVulnerabilities()返回null,直接调用equals()/isEmpty()/size()会立刻触发NullPointerException;
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:44:36