list All elements are null引起的異常


ArrayList允許添加null值,就容易造成了list內的對象轉換出現java.lang.NullPointerException異常。

 

場景:

數據庫 select  min(id) as id,min(name) as name from user where 1=2;

查詢出的不是沒有記錄,而是一條 null,null這樣的記錄,導致User對象為null

List<User> users = useDao.find(xxx); //size=1,All elements are null

這時候對user對象操作就會報錯!

 

解決辦法

法一:移除null元素

 

示例:

 List<User> users = new ArrayList<User>();
        users.add(null);
        users.add(null);
        users.add(null);
        System.out.println("size:"+users.size()); //size:3
        for(User user:users){
            try {
                System.out.println("id:" + user.getId() + ",name:" + user.getName());
            }catch (Exception ex){
                System.out.println(ex); //java.lang.NullPointerException
            }
        }
        users.remove(null); //移除第一個null
        System.out.println("size:"+users.size()); //size:2
        users.removeAll(Collections.singleton(null)); //移除所有的null元素
        System.out.println("size:"+users.size()); //size:0
        //不會進入循環
        for(User user:users){
            try {
                System.out.println("id:" + user.getId() + ",name:" + user.getName());
            }catch (Exception ex){
                System.out.println(ex);
            }
        }

 

法二:保證數據庫查詢出來沒有null值,即遇null值轉換為默認值


mysql下使用ifnull/case when均可實現
select  ifnull(min(id),-1) as id,ifnull(min(name),'defaultName') as name from user where 1=2;
select  case when min(id) is null then -1 else min(id) end as id,case when min(name) is null then 'defaultName' else min(name) end as name from user where 1=2;

這樣子查詢出來的結果如下
id name
-1 defaultName

總結:具體情況依據業務實現,當對數據庫查詢統計的時候,沒有group by關鍵字而使用聚集函數的時候一定要注意null值情況
(有group by是分組統計,找不到記錄就是沒有記錄),至於你想要始終查詢出來一條記錄且元素有默認值,還是不要顯示記錄,依據業務而定。兩種情況對應兩種解決方案。
 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM