关于如何对待NPE(NullPointerException)问题
关于如何处理NPE问题,我至今没有定论.仅说说自己浅薄的看法
JAVA的Optional工具类非常方便的处理NPE,但处理NPE不是代码的问题,是对业务设计规范的问题
如果不了解Optional可以去查询一下.Optional类的代码非常简洁,但它的设计逻辑非常棒
情况1:对象为空时,需要给它默认值
Integer a = null;
Optional.ofNullable(a).orElse(0)
上面代码意思就是当a为不为空时返回a,否则返回默认值0,这里提一下orElse
和orElseGet
的异同,从效果上没区别,但是性能有区别,orElseGet
的意思在需要返回默认值时才去获取它(优化了性能).
情况2:对象为空时,代码无法往下执行了
Optional.ofNullable(obj).orElseThrow(customException)
- 这种情况非常常见,解决方法应该是抛出异常,我们可以使用
orElseThrow
将NPE转换为业务级异常,当然也可以使用断言的方式, - 或许读者可能会疑惑尽管不做任何处理NPE也会被抛出的,但是笔者认为这样的处理方式,是一种行为规范,即重视对象的NPE问题.以及需要考虑对象为什么会为空(什么条件下为空),
- 作为业务级设计来讲,如果不去思考
情况2
,那么可能就得不出需要使用情况3
的结论. - 当然作为
情况2
读者也可以不做任何处理,我这里将它定义为隐式的情况2处理方式
情况3:对象为不为空时,代码才执行
Optional.ofNullable(query).ifPresent(p->p.hashCode());
这种情况一般用于对对象以及对象相关的修饰处理,在业务上有就处理,没有就不处理的业务逻辑.