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

 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. SQL——AND、OR运算符

    一.AND.OR运算符基本说明 AND : 所有条件成立,则筛选出这条记录. OR : 只要其中一个条件成立,则筛选出这条记录. 演示student表: 二.AND运算符使用 查询name = '小明 ...

  2. A Simple Question of Chemistry

    #include<stdio.h> int main() { int i, l; ]; ]; l = ; ) { l++; } ; a[i]!= && i<l; i+ ...

  3. javascript 代码实例

    数组去重 function unique(arr){ if(!Array.isArray(arr)){ console.log('type error!'); return; } arr = arr. ...

  4. [高清] 深入浅出Spring Boot 2.x.pdf + 代码

    ------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...

  5. 【转载】终于有人把“TCC分布式事务”的实现原理讲明白了

    之前网上看到很多写分布式事务的文章,不过大多都是将分布式事务各种技术方案简单介绍一下.很多朋友看了还是不知道分布式事务到底怎么回事,在项目里到底如何使用. 所以这篇文章,就用大白话+手工绘图,并结合一 ...

  6. 15天入门RT-Thread之第一天

    今天开始学习jiezhi15天的RT-Thread入门系列课程 感谢RT-Thread提供的免费课程,终于可以系统入门RT-Thread ,感兴趣的同学可以关注RT-Thread官方公众号,获取最新的 ...

  7. centos7.5 离线安装ntp服务

    安装 #检查rpm包 rpm -qa | grep ntp #从https://pkgs.org/download/ntp 下载rpm包 ntp-4.2.6p5-28.el7.centos.x86_6 ...

  8. 面试总结 转发(CSDN 博主)

    1 https://blog.csdn.net/jackfrued/article/details/44921941 2 https://blog.csdn.net/jackfrued/article ...

  9. vue实现滑块滑动校验

    为了防止机器操作自动提交,我们需要添加滑动校验. 实现代码如下:   1.子组件slider.vue <template> <div class="drag" r ...

  10. 苹果手机浏览器的$(document).on(“click”,function(){}) 绑定的事件点击无效

    需要给对应的元素加上 cursor: pointer  的css样式才可以生效点击事件: