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

IntelliJ提示代码存在空指针风险,现有校验逻辑是否能规避NPE?

触发空指针告警的根因

存在两个核心触发原因:

  • 你在代码中两次调用contract.getActs(),IntelliJ的静态分析逻辑不会默认假设Getter方法的返回值恒定:Java语法没有强制约束Getter必须返回不变的对象,极端场景下(比如多线程并发修改contract的acts属性、getActs()自定义实现存在动态返回null的逻辑等),第一次调用getActs()判断非空后,第二次调用完全可能返回null,此时执行(!contract.getActs().isEmpty())就会触发空指针。
  • 你的else if逻辑本身存在冗余且逻辑运算符使用存在隐患:第一个if的判断条件为contract.getActs() == null || contract.getActs().isEmpty(),满足任意条件就会直接返回true,能走到else分支的前提就是contract.getActs() != null 且 contract.getActs().isEmpty() == false,这个else if的判断完全是多余的。且你在else if中使用了||作为逻辑运算符,只要contract.getActs() != null不成立,就会继续执行右侧的!contract.getActs().isEmpty()判断,此时getActs()已经为null,必然触发空指针,IntelliJ识别到了这个逻辑风险。
修复方案

方案1(推荐):删除冗余判断

既然走到else分支时acts必然非空非null,直接执行遍历逻辑即可,彻底消除风险:

private boolean checkStatusAct(Contract contract) {
    if (contract.getActs() == null || contract.getActs().isEmpty()) {
        return true;
    }
    for (ContractAct contractAct : contract.getActs()) {
        if (contractAct.getStatusId() == 15) { 
            return true;
        }
    }
    return false;
}

方案2:用局部变量缓存Getter返回值

如果需要保留多轮判断的写法,先把getActs()的结果存入局部变量,避免多次调用Getter的返回值不一致问题,同时将else if的逻辑运算符修正为&&:

private boolean checkStatusAct(Contract contract) {
    List<ContractAct> acts = contract.getActs();
    if (acts == null || acts.isEmpty()) {
        return true;
    } else if (acts != null && !acts.isEmpty()) { 
        for (ContractAct contractAct : acts) {
            if (contractAct.getStatusId() == 15) { 
                return true;
            }
        }
    }
    return false;
}

内容的提问来源于stack exchange,提问作者Morningstar-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:39:02