java 迭代可空错误检查器框架

sdnqo3pr  于 2023-04-10  发布在  Java
关注(0)|答案(2)|浏览(105)

我正在将检查器框架集成到我们的项目中。我遇到的一个问题是iterating.over.nullable。我不知道为什么会出现这个错误,因为我在访问列表的元素之前使用CollectionUtils.isEmpty()验证了列表。
列表项是Nullable,但据我所知,因为我在访问之前进行了检查,所以它不应该引发错误。如果有人能指出我做错了什么,我将不胜感激。下面是代码。我在第4行得到了错误iterating.over.nullable

public List<MyCustomObject> map(Delivery delivery) {
    List<MyCustomObject> delList = new ArrayList<>();
    if (!CollectionUtils.isEmpty(delivery.getDeliveries())) {
        for (MyCustomObject deliveries : delivery.getDeliveries()) {
            //Processing code
        }
    }
    return delList;
}

先谢谢你了。
1.尝试使用CollectionUtils.isEmpty,因为它检查列表是否为null或空

zfycwa2u

zfycwa2u1#

空值检查器已经识别出一个真正的问题,最好的解决方案是 not 取消警告。问题可能在您的代码或注解中。
像这样的问题及其解决方案在Checker Framework手册的副作用、确定性、纯度和类型细化一节中进行了讨论。
if测试中,delivery.getDeliveries()的计算结果为非null和非空值。但是,不能保证for循环中的第二次调用 * 也 * 计算结果为非null和非空值。
因此,在for循环中,delivery.getDeliveries()确实可能为null,并且在运行时可能发生NullPointerException。
一种方法是将表达式提取到局部变量中:

Collection<MyCustomObject> allDeliveries = delivery.getDeliveries();
if (!CollectionUtils.isEmpty(allDeliveries)) {
  for (MyCustomObject deliveries : allDeliveries) {
    // Processing code
  }

另一种方法是将getDeliveries()方法声明为@Deterministic

aiazj4mn

aiazj4mn2#

if(delivery!= null &&!CollectionUtils.isEmpty(delivery.getDeliveries())){

相关问题