list All elements are null引起的异常,elementsnull

2018-01-25 20:14:39

list All elements are null引起的异常,elementsnull


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


  • 2019-12-14 21:04:05

    聊聊keep-alive组件的使用及其实现原理

    keep-alive是Vue.js的一个内置组件。它能够不活动的组件实例保存在内存中,而不是直接将其销毁,它是一个抽象组件,不会被渲染到真实DOM中,也不会出现在父组件链中。 它提供了include与exclude两个属性,允许组件有条件地进行缓存。

  • 2019-12-14 21:06:58

    vue----keep-alive缓存,activated,deactivated两个生命周期函数,,meta实现缓存

    如果没有缓存,每点击一次导航,内容区就会创建一个组件,该组件会经历整个生命周期,每点击一次,就会创建一个组件,比较浪费性能, 这时,我们就要考虑到是否能将点击过的已创建的组件进行缓存,当再次点击已访问过的组件时,这时,就会从缓存中获取该组件,而不会重新创建,

  • 2019-12-17 11:56:05

    ffmpeg concat video and mix audio,ffmpeg简单快速的合并视频

    在ffmpeg中,官网给出两种连接媒体文件(音频、视频、etc..)的解决方案。 the concat "demuxer" the concat "protocol" 对比而言, demuxer更加灵活一些,需要媒体文件是属于相同的编解码器,但是可以属于不同的容器格式(mp3,wav, mp4, mov, etc..). 而protocol只适用于少数集中容器格式。

  • 2019-12-17 11:58:55

    FFmpeg文章目录

    seek ffmpeg # How to seek in mp4/mkv/ts/flv ffmpeg # flags &= ~AVSEEK_FLAG_BACKWARD ffmpeg # AVSEEK_FLAG concat ffmpeg # concat 连接两个视频 ffmpeg # -f concat -i mylist.txt ffmpeg # concat详解+音画同步策略 截图

  • 2019-12-18 23:26:00

    FFMPEG命令记录

    ffmpeg,拼接两个音频,剪切音频片段,多个音频混音,剪切一段MP4并转换成gif,改变音量大小,音频淡入淡出,音频格式处理