Java 是如何优雅地处理NPE问题的

2020-05-28 00:00:00 是一个 返回 引用 方法 类型



1. 前言


对于 Java 开发者来说,null 是一个令人头疼的类型,一不小心就会发生 NPE (空指针) 问题。也是 Java 语言为人诟病的一个重要原因之一。在我们消除可恶的 NPE 问题之前我们要回顾一下 Java 中 null 的概念。


2. Java 中的 null


翻译自 Oracle Java 文档


Java语言中有两种类型,一种是 基本类型 ,另一种是 引用类型。还有一种没有名字的特殊类型,即表达式 null

由于 null 类型没有名称,所以不可能声明为 null 类型的变量或者转换为 null 类型。

null 引用是null 类型表达式可能的值。

null 引用可以转换为任意引用类型。

事实上,程序员可以忽略null类型,可以认为null仅仅是一个可以成为任何引用类型的特殊符号。


从上面的描述我们可以了解到,其实 null 仅仅是一个关键字标识量,既不是一种类型也不算对象,无法直接声明 null 和被转换为 null,仅仅只能被引用,null 可以转换为任何引用类型。当一个 Java 引用类型对象被引用为 null 时代表当前对象不引用对象,并没有为其分配内存。 这也是我们在没有引用的对象上调用方法出现空指针的根本原因。大多数情况下 Java 开发者使用 null 是为了表示某种不存在的意思。


3. NPE 问题的解决


很多时候我们对数据是否存在有自己的期望,但是这种期望并不能直接被我们掌控,一个返回值为 null 所表达的意思并不明确过于模糊,往往通过是否判断为 null 来规避空指针问题。于是 Google 工程师在他们的 Guava 工具类库中设计了 Optional
来解决 null 不可控的问题。 让你在不得不使用 null 的时候,可以更加简便明确的使用 null 并帮助你避免直接使用 null 带来的问题。Java 8 将此设计吸收。我们可以直接使用 Java 提供的 Optional 来解决空指针问题。接下来我们来研究一下 Java 8 中的 Optional


4. Java 8 中的 Optional


Java 8 中的 Optional 是一个可选值的包装类。它的意义不仅仅帮我们简化了 NPE 问题的处理,同时也是 Java 函数式编程的一个重要辅助。 我们接下来将对其 API 进行讲解以帮助你在实际开发中使用他们。


4.1 Optional 声明


Optional 只能通过静态方法来声明。它提供了三个静态方法:


empty() 返回一个值为 nullOptional 实例


  Optional<Object> empty = Optional.empty();

相关文章