实践中考虑到这个问题,读了知乎RednaxelaFX及很多朋友的回答,感觉豁然开朗。
知乎问题出处:https://www.zhihu.com/question/47997295
由于原文禁止转载,按我的理解总结几句:
- null值自身不会引起问题,但未必是很好的实践方法
- 使用null在解引用(dereference)时会引起NullPointerException的异常抛出
- 一般解引用操作有:
- 读attribute
- 写attribute
- 读数组length
- 读数组element
- 写数组element
- 调用method
- foreach用法(隐含读length或调用method)
- Auto-unboxing
- 对String做switch
- 创建内部类对象实例
- 抛异常throw obj
- synchronized (obj) { … }
- obj.getClass()可以检查对象是否为null并抛出NPE
- Objects.requireNonNull(obj)是检查null并抛出NPE常规做法
- 工程上调用时多一个null判断是个好习惯
- Java 8的Optional是个不错的选择(Optional 类的引入很好的解决空指针异常)
- 可以采用零长度的数组和集合代替返回null(Collections.EMPTY_LIST, Collections.EMPTY_SET和 Collections.EMPTY_MAP)
- 注意使用@NotNull 或者 @Nullable 注解