list.size() = 1 但是報空指標NullPointException
阿新 • • 發佈:2019-01-06
一 需求
遍歷一個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 ,誰是主表!