1. 程式人生 > >list.size() = 1 但是報空指標NullPointException

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 ,誰是主表!