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-
相关产品推荐
相关产品推荐

