NPE向来是一个让java程序员头疼的问题,如何优雅的处理它?
判空灾难
首先想到的肯定是判空,增加代码健壮性,但带来的问题是,代码里大量的充斥着
及其不优雅,如何解决找个问题?
善用轮子
对于各种判空,前辈们已经造好了很多轮子,下面就是我的一些用到的,有其他的大家评论区见(会同步更新到文章)加粗为最常用的
- String类型判空
对于字符串类型的判空就有很多了如:
- 谷歌的guava的Strings
- 最常用的apache的StringUtils
- spring 的StringUtils(可以判断对象)
- 对象类型判空
对象类型的判空除了上边那个外还有:
- java.util的Object
- spring的ObjectUtils
- apache的ObjectUtils(lang3版本)
- 集合类判空
集合类包含判空和判断内容是否为空
- apache的CollectionUtils
- spring的CollectionUtils
- java自带的isEmpty(只能判断没有值)
- Map判空
- apache的MapUtils
使用java8的Optional
java8引入了对空对象的操作,直接避免了空指针异常,但其应用范围没有那么广,适应于对空值的处理,但并不适用于一些if-else的情况,所以其无法彻底代替if-else(filter功能可能可以代替),关于Optional的更多请参考我的关于Optional的文章
- 最常用的
使用Optional.ofNullable()来包装一个可能为空的对象
使用orElseGet或者orElse来处理空值,使用ifPresent来处理不为空要执行的内容
示例
- orElse
orElse用来处理有默认值的情况其接收一个判断类型的默认值,表示当判断对象为空的时候返回,上面代码表示当key是空的时候返回"0" - orElseGet
orElseGet与orElse的区别就是前者接收一个函数,大大的扩展了使用场,最重要的区别是前者效率高,因为当对象不为null的时候前者括号里的东西根本不执行,上面代码表示当data的那个键对应的值为空的时候记录日志并返回"0" - ifPresent
该方法用来处理当判断对象不为空要执行的操作,上面代码表示不为空时打印结果