先假设一个场景。如下所示

 public class Person {

     private String name;

     public Person() {
} public Person(String name) {
this.name = name;
} public String getName() {
return name;
}
}

  我们有一个Person类,有一个属性是name。有如下代码:

 public static void main(String[] args) {
Person person = new Person(); String name = person.getName(); if (name.equals("Jackson")) {
System.out.println("My name is Jackson!");
}
}

  我们判断获取person的name,然后判断person的name是不是Jackson。因为person的name为null,所以name.equals("Jackson")这段代码会报空指针的异常。

  我们有多种方式来处理空指针的异常,一种是我们考察我们的业务逻辑,当需要返回一个null值时返回一个有意义的NullObject。例如空字符串对应返回字符串的情况,空列表对应返回list的情况,对一些特殊的对象,可以根据不同的业务逻辑创建一些Null对象。参考《Effictive Java》第43条,《重构》9.7节。

  对于我们的例子,当name为null时,getName方法返回一个""字符串。当接下来取出name来进行操作时就不会出现空指针的异常。

 public String getName() {
if (name == null) {
return "";
} else {
return name;
}
}

  另一种是在调用的时候判断是否为空,对于我们的例子,如下代码:

 if (name != null && name.equals("Jackson")){}

  通过判断name是否为空,若非空再判断name是否等于Jackson。通过这样的方式可以解决空指针异常的问题。

  但是两种方案都有一定的缺点,对于第一种方案,String和集合类型的Null对象很好确认,就是空字符串和空集合。但是对于一些特殊的对象,创建Null对象需要更多的步骤,更多的设计。总之就是两个字,麻烦。

  对于第二种方案,这个也是我们最常用的。但是这个方案有一个问题,就是经常会忘记判空。对于一个方法other.method(a, b),我们常常不会忘记对a和b进行判空,而对方法的返回值却经常忘记判空。而这个空指针异常是在运行时才会被发现,如果空指针的情况十分的罕见,那么很可能很长一段时间都不会发现这个异常。我常常碰到的一种情况是当数据库中存在脏数据的时候,正常的数据是不应该存在null的,但是即使是生产环境也很有可能混入一两个脏数据,很可能这罕见的脏数据导致程序报错。可能这个时候再去修复bug,代价比开发阶段高很多。

  为了优雅地处理null的情况,可以使用Java8的新特性Optional。API不说了,直接上代码

 public class Person {

     private String name;

     public Person() {
} public Person(String name) {
this.name = name;
} public Optional<String> getName() {
return Optional.ofNullable(name);
} public static void main(String[] args) {
Person person = new Person(); Optional<String> optionalName = person.getName();
if (optionalName.isPresent()) {
String name = optionalName.get();
System.out.println("My name is :" + name);
} else {
System.out.println("Who am I?");
}
}
}

  在getName里,我们由原来直接返回name,改成返回Optional<String>。通过Optional.ofNullable(T)静态方法,可以创建一个Optional对象。如果传入的对象是null,那么isPresent返回false,否则返回true。在上诉代码中,Person的name没有设置,optionalName.isPresent()返回的是false,所以打印出的应该是Who am I?

  从代码上看,这个和第二种方案,对对象判空的方法没有区别,都是先判断是否存在,然后再对对象进行操作。因为我们没法直接获取所需的对象,而是获得Optional对象,需要从Optional中获取我们需要的对象,因为不判空取不到所需对象,所以我们就不会忘了判空这步操作了。

使用Optional优雅处理null的更多相关文章

  1. Guava学习笔记(1):Optional优雅的使用null

    转自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html 参考:[Google Guava] 1.1-使用和避免nu ...

  2. Optional优雅的使用null

    在我们学习和使用Guava的Optional之前,我们需要来了解一下Java中null.因为,只有我们深入的了解了null的相关知识,我们才能更加深入体会领悟到Guava的Optional设计和使用上 ...

  3. Guava学习笔记:Optional优雅的使用null

    在我们学习和使用Guava的Optional之前,我们需要来了解一下Java中null.因为,只有我们深入的了解了null的相关知识,我们才能更加深入体会领悟到Guava的Optional设计和使用上 ...

  4. Atitit. null错误的设计 使用Optional来处理null

    Atitit. null错误的设计 使用Optional来处理null 然后,我们再看看null还会引入什么问题. 看看下面这个代码: String address = person.getCount ...

  5. java8 Optional优雅非空判断

    java8 Optional优雅非空判断 import java.util.ArrayList;import java.util.List;import java.util.Optional; pub ...

  6. Google Guava之Optional优雅的使用null

    为什么使用optional 使用Optional<T>除了简化粗鲁的if(null == object).降低函数的复杂度.增加可读性之外,它是一种傻瓜式的防护,Optional<T ...

  7. Jdk14都要出了,还不能使用 Optional优雅的处理空指针?

    1. 前言 如果你没有处理过空指针,那么你不是一位真正的 Java 程序员. 空指针确实会产生很多问题,我们经常遇到空的引用,然后又想从这个空的引用上去获取其他的值,接着理所当然的碰到了 NullPo ...

  8. Java 中遇到null 和为空的情况,使用Optional来解决。

    Java 中遇到null 和为空的情况,使用Optional来解决 示例代码: package crazy; import java.util.Optional; class Company { pr ...

  9. JDK8 Java 中遇到null 和为空的情况,使用Optional来解决。

    空指针是我们最常见也最讨厌的异常,写过 Java 程序的同学,一般都遇到过 NullPointerException :) 初识null 详细可以参考[jdk 1.6 Java.lang.Null.P ...

随机推荐

  1. Java开发笔记(一百四十)JavaFX的选择框

    与Swing一样,JavaFX依然提供了三种选择框,它们是复选框CheckBox.单选按钮RadioButton.下拉框ComboBox,分别说明如下: 一.复选框CheckBox复选框允许同时勾选多 ...

  2. python 之网络编程(基于TCP协议Socket通信的粘包问题及解决)

    8.4 粘包问题 粘包问题发生的原因: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包),这样接收端,就难于分辨出来了,必须提供科学的拆包机制. ...

  3. 用Python递归做个多层次的文件执行

    想用 递归实现多层次的 '.py'执行但是发现好像不能 import os def func(path): if os.path.isdir(path): for name in os.listdir ...

  4. c#连接Access数据库及增删改查作

    access:版本2003(后缀.mdb,新版access可另存为2003兼容版) using: using System;using System.Data;using System.Windows ...

  5. GC偏好

    GC偏好 测序中的GC偏好指的是基因组上GC含量在50%左右的区域更容易被测到,产生的reads更多,这些区域的覆盖度更高, 在高GC或者低GC区域,不容易被测到,产生较少的reads,这些区域的覆盖 ...

  6. 2 Match、Filter、排序、分页、全文检索、短语匹配、关键词高亮

    查索引内所有文档记录 GET  /beauties/my/_search   GET  /beauties/my/_search {     "query":{         & ...

  7. 父元素设置min-height子元素设置100%问题

    问题:父元素设置min-height子元素高度设置100%取不到值,这是因为子元素 div设置 height:100%: 只有当父级元素满足min-height:1000px;设置的条件才触发: 浏览 ...

  8. 修改Mysql 字符集,支持Emoji表情

    插入失败 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1 at ...

  9. 【hadoop】在eclipse上运行WordCount的操作过程

    序:本以为今天花点时间将WordCount例子完全理解到,但高估自己了,更别说我只是在大学选修一学期的java,之后再也没碰过java语言了 总的来说,从宏观上能理解具体的程序思路,但具体到每个代码有 ...

  10. MySQL Backup--xtrabackup与Bulk Load for Create Index

    场景描述:主从使用MySQL 5.7.19 1.从库上使用xtrabackup进行热备. 2.主库行执行DDL创建索引: ALTER TABLE `tb_xxx` ADD INDEX idx_good ...