项目中尤其是在持久层,难免会有大量的针对集合,对象,字符串的操作,为了程序的健壮性,我们不得不进行判空,像下面箭头式编码吗?

if(null!=person){
...
if(null!=address){
...
if(null!=phone){
...
}
} }

NO


优雅的规避空指针异常

一. 工具类

坐标

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>

针对字符串

String name="";
boolean blank = StringUtils.isBlank(name);
System.out.println(blank);

坐标

<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>

针对集合

boolean empty = CollectionUtils.isEmpty(new ArrayList());
System.out.println(empty);

上面两个工具类也是真正项目中重用的,会比我们自己写一堆if去判断相对安全


我们知道,后端通常会从DB查询多条数据,封装一个集合交给前端渲染,一旦这个集合为空,就会报错 NPE,前面的工具类可以帮我们很好的做出判断,具体怎么做,大概有两种方式

  • 第一种,我们自定义异常,一旦出现null,我们抛出自定义的异常给前端,前端接收到异常,进行处理
  • 第二种,一旦出现null;我们手动new 一个相应的集合或者对象,前端接受到空的集合,渲染的也是空,同样避免的空指针异常

二. Optional

位于java.util包下Optional是jdk8新增的final工具类,我们可以通过它以一种函数式风格灵活的进行判断,处理

Optional是一个容器对象,传递给它什么,他就包装什么!

它有如下几种工厂方法创建OPtional对象

  • 使用 of 方法, 必须确保传递进去的对象不为空,不然直接抛出空指针异常
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
  • 创建一个一定为空的容器对象
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
  • 创建一个可能为空,也可能不为空的容器对象
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}

下面几个方法引入函数式编程风格

  • 如果容器为空,打印备选值
System.out.println(optional.orElse("hello"));
  • 如果容器为空,打印备选值 入参是Supplier, 不接受参数返回一个结果
System.out.println(optional.orElseGet(()->"haha"));

如何使用函数式编程风格替换掉

if(null!=list){
return list;
}else{
return new ArrayList():
}
//模拟后端的查询出来的结果
List<student> list = Arrays.asList(new student(1, "123"), new student(2, "123"));
OptionalText optionalText = new OptionalText();
optionalText.setStuList(list); //创容器
Optional<OptionalText> optional1 = optional.ofNullable(optionalText);
//容器里面对象的list如果有值则返回,如果没有,则返回空list
List<student> students = optional1.map(item -> item.getStuList()).orElse(new ArrayList<student>());
  • 此外: Optional不能作为成员变量,方法参数 通常是作为方法的返回值

如何优雅规避NPE的更多相关文章

  1. 【Java 8】巧用Optional之优雅规避NPE问题

    避之不及的 NullPointerException NPE : NullPointerException 空指针异常是最常见的Java异常之一,抛出NPE错误不是用户操作的错误,而是开发人员的错误, ...

  2. 使用Optional,不再头疼NPE

    前言 在 Java 语言开发中,可能大多数程序员遇到最多的异常就是 NullPointException 空指针异常了.这个当初语言的开发者"仅仅因为这样实现起来更容易"而允许空引 ...

  3. Optional 理解

    目录 Optional 理解 1. 含义 2. Optional 类中方法 3. Optional 对象不应该作为方法参数 Optional 理解 1. 含义 Optional 是一个容器对象,该容器 ...

  4. JDK8中Stream使用解析

    JDK8中Stream使用解析 现在谈及JDK8的新特新,已经说不上新了.本篇介绍的就是Stream和Lambda,说的Stream可不是JDK中的IO流,这里的Stream指的是处理集合的抽象概念『 ...

  5. JAVA8学习——从使用角度深入Stream流(学习过程)

    Stream 流 初识Stream流 简单认识一下Stream:Stream类中的官方介绍: /** * A sequence of elements supporting sequential an ...

  6. Java 8 Optional:优雅地避免 NPE

    本篇文章将详细介绍 Optional 类,以及如何用它消除代码中的 null 检查.在开始之前首先来看下什么是 NPE,以及在 Java 8 之前是如何处理 NPE 问题的. 空指针异常(NullPo ...

  7. 如何优雅的使用Objects.requireNonNull(T obj, String message)定制你的NPE异常

    IDEA中习惯跟踪源码实现逻辑,多次碰到Objects.requireNonNull(T obj)这个方法,改方法主要用于提早判断对象是否为空,以便更早的抛出NPE 平时小组开发中强调程序健壮性,不允 ...

  8. 如何优雅地使用Sublime Text

    Sublime Text:一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相比于难于上手的Vim,浮肿沉重的Eclip ...

  9. 阿里巴巴最新开源项目 - [HandyJSON] 在Swift中优雅地处理JSON

    项目名称:HandyJSON 项目地址:https://github.com/alibaba/handyjson 背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发 ...

随机推荐

  1. NodeJS4-1静态资源服务器实战_实现访问获取里面的内容

    .gitignore 匹配模式前 / 代表项目根目录 匹配模式最后加 / 代表是目录 匹配模式前加 ! 代表取反 * 代表任意一个字符 ? 匹配任意一个字符 ** 匹配多级目录 统一代码风格配置可以用 ...

  2. Python是什么?你真的了解Python吗?

    一.Python是什么相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是一种开发语言,而且已经进阶到 ...

  3. Docker+DokcerFile 简单命令和简单镜像配置----Tomcat+jdk+centos7

    宿主机描述:docker info (自身的描述)docker --helpdocker images(查看所有镜像)docker images -adocker images -q(显示镜像ID)d ...

  4. Django:永别了pycrypto库~

    在开发微信登陆功能时,解密用户信息需要使用到 Crypto 包,所以安装了pycrypto库. Linux.OS X 系统均可直接 pip install pycrypto . 最近换到win10下开 ...

  5. Linux 命令行初始化MySQL数据库

    作为一个技术纯小白,在Linux服务器初始化MySQL数据库的时候遇到了一点小问题: ​ 1.不会使用MySQL图形工具,几乎没玩过 ​ 2.客户的VPN没有开放3306端口,没法用navicat等工 ...

  6. 50道Redis面试题史上最全,以后面试再也不怕问Redis了

    1.什么是Redis? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存. ...

  7. PHP实现微信扫码自动登陆与注册,参考实例

    微信开发已经是现在phper必须要掌握的一项基本的技术了,其实做过微信开发的都知道微信接口非常的强大做起来也非常的简单,这里我们一起来看一个微信自动登陆注册的例子. php 微信扫码 pc端自动登陆注 ...

  8. 关于c# winform 键盘响应右边键盘消息响应事件的上下左右方向键没有反应

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11835642.html 记录一下这个小坑,c# winform 键盘响应右边键盘的上下左右方向 ...

  9. NET Framework项目移植到NET Core上踩的坑(1)

    本文章向大家介绍NET Framework项目移植到NET Core上遇到的一系列坑,主要包括NET Framework项目移植到NET Core上遇到的一系列坑使用实例.应用技巧.基本知识点总结和需 ...

  10. EntityFramework中实体类到表名的批量映射

    在使用EntityFramework做CodeFirst开发时,经常需要将实体类映射到数据库表,但是C#实体类和数据库表中的命名遵循的是不同的规范,这就需要为每个实体类做一个到数据库表名的映射.大多情 ...