千家信息网

如何使用Optional处理Java中null类型的异常报错

发表于:2024-09-25 作者:千家信息网编辑
千家信息网最后更新 2024年09月25日,本篇内容介绍了"如何使用Optional处理Java中null类型的异常报错"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔
千家信息网最后更新 2024年09月25日如何使用Optional处理Java中null类型的异常报错

本篇内容介绍了"如何使用Optional处理Java中null类型的异常报错"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、聊聊NullPointerException

相比做Java开发的,见到NullPointerException肯定不陌生吧,可以说见到它深恶痛绝。在开发时认为不会出现NullPointerException异常,最终到了生产环境,就给你来点意外惊喜。但是在开发时处理对象为空的通常都是用if(null != xxx),或者使用一些工具类,比如:if(ObjectUtils.isEmpty(xxx)),可以看出这种处理会让我们的代码变得很臃肿,遇到一个对象时可能都要这样来一下。

使用Optional类就可以避免在程序中使用一堆的if来处理空了。下表列出Optional类中的方法:

方法名描述
empty返回一个空的Optional实例
of将指定值用Optional封装后返回,如果值为null,则抛出NullPointerException异常
ofNullable将指定值用Optional封装后返回,如果值为null,则返回空的Optional对象
get如果值存在,则返回该值,否则抛出NullPointerException异常
isPresent检查值是否存在,存在返回true,否则返回false
ifPresent如果值存在,就执行使用该值的方法调用,否则什么都不做
filter如果值存在并且满足提供的谓词,就返回包含该值的Optional对象,否则返回空的Optional对象
map如果值存在,就对该值执行提供的mapping函数调用
flatMap如果值存在,就对该值执行提供的mapping函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
orElse如果值存在就将其返回,否则返回指定的的值
orElseGet如果值存在就将其返回,否则返回由指定的Supplier接口生成的值
orElseThrow如果值存在就将其返回,否则抛出由指定的Supplier接口生成的异常

下面就一一来详细使用上面列出的方法。

二、使用Optional类

2.1 empty

Optional user = Optional.empty();

创建一个空的Optional对象

2.2 of

User user = null;Optional optional = Optional.of(user);

user为空,直接报NullPointerException异常,因此该方法一般很少用。

2.3 ofNullable

User user = null;Optional optional = Optional.ofNullable(user);

user为空,则返回空的Optional对象

2.4 get

User user = null;Optional optional = Optional.ofNullable(user);optional.get();

Optional中获取值,如果值不存在则抛出如下异常:java.util.NoSuchElementException: No value present

2.5 isPresent

User user = null;Optional optional = Optional.ofNullable(user);optional.isPresent();

以上例子返回false,如果user不为空,则返回true

2.6 ifPresent

User user = null;Optional optional = Optional.ofNullable(user);optional.ifPresent(us->{        //user不为空,执行 });

2.7 filter

User user = new User();user.setName("小A");boolean result = Optional.ofNullable(user).filter(us -> "小A".equals(us.getName())).isPresent();

如果用户名为小A,则返回true,否则返回false

2.8 map

User user = new User();user.setName("小A");String name = Optional.ofNullable(user).map(User::getName).get();

如果user不为空,则抽取name属性,使用get()获取。这里如果name为空,则会报异常,因此通常都是指定默认值或使用自定义异常抛出。

String name = Optional.ofNullable(user).map(User::getName).orElse("");

String name = Optional.ofNullable(user)                .map(User::getName)                .orElseThrow(()->new RuntimeException("用户名不能为空"));

2.9 flatMap

该方法一般用于从类中获取其他类的中某个属性,比如一个班级里面有学生,学生里面有地址,现在需要获取这个班级下的某个学生的地址,按之前的写法:

Address address = new Address();address.setAddr("天河区");Student student = new Student();student.setName("小A");student.setAddress(address);Grade grade = new Grade();grade.setName("三年级2班");grade.setStudent(student);if(!ObjectUtils.isEmpty(grade)){    Student student1 = grade.getStudent();    if(!ObjectUtils.isEmpty(student1)){        Address address1 = student1.getAddress();        if(!ObjectUtils.isEmpty(address1)){            System.out.println(address1.getAddr());        }    }}

为了程序不出问题,就会写一大堆的if来判断,下面用flatMap来看下怎么实现:

Optional.ofNullable(grade)                .flatMap(g->Optional.ofNullable(g.getStudent()))                .flatMap(s->Optional.ofNullable(s.getAddress()))                .map(Address::getAddr)                .orElse("")

Optional.ofNullable(grade)        .map(Grade::getStudent)        .map(Student::getAddress)        .map(Address::getAddr)        .orElse("")

2.10 orElse

Optional.ofNullable(grade).orElse(new Grade());

2.11 orElseGet

Optional.ofNullable(grade).orElseGet(()->new Grade());

2.12 orElseThrow

Optional.ofNullable(grade).orElseThrow(()->new RuntimeException("班级不能为空"));

以上Optional类的全部方法的使用都列出来了。

"如何使用Optional处理Java中null类型的异常报错"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0