list.size() = 1 但是报空指针NullPointException

一 需求

遍历一个list,然后循环获取值

二 代码

if(StringUtils.isNotEmpty(booking.getStore_id())) {
    
    costAmountList = bookingMapper.getProductCostPrice(bookingId,             
    booking.getStore_id());

}

if(costAmountList != null && costAmountList.size() > 0) {
        
    if(booking.getContact_gender() == 0) {
        
        for(ProductCostPrice item : costAmountList) {
            
            log.info("男成本价 "+item.getMale_cost_price());
                        
            if(item.getMale_cost_price() != null) {
                
                costAmount = costAmount.add(item.getMale_cost_price());
                
            } else {
                
                costAmount = BigDecimal.ZERO;
            
            }
      
        }
  
    }
}

刚开始做了 list != null && list.size() > 0 判断,并且也判断了字段值 !=  null ,但是线上还是报空指针,我本地模拟数据,结果是

这让我很想不通,为什么会这样?

原来这个list是多张表left join 取出来的,list是 某张表的别名.* 得来的,我把sql放到navicate执行了一下,发现真的都是NULL,我放开了限制,查出来所有表的数据!哇,前面几张表都有数据,到list这张表就全是null。写到这里,有没有想到什么???

三 分析

        关于left join 的问题,left join:如果主表查出数据,右表不管是什么情况,都显示出来!即使都是NULL!
        如果有多个left join,一定要分清楚什么是主表,不然会出现,pcp.* 全是null,即使后台list.size() =1,并且也符合 list != null && list.size() > 0 ,但是,显示 all elements are null。解决办法是,把需要用到到那张表当作主表,这样,因为左表没有数据,想到 LEFT JOIN,so list 为空!

所有注意两点:LEFT JOIN ,谁是主表!

猜你喜欢

转载自blog.csdn.net/u014425865/article/details/83098498