Optional类如何解决空指针异常
Optional类如何解决空指针异常
小编为大家解答Optional类如何解决空指针异常的相关经验,下面IT袋网为您详细介绍
在Java应用程序中,空指针异常是导致程序失败的最常见原因之一。
为了更加优雅地处理空指针异常,Java8引入了Optional类库。
Optional实际上是一个容器,可以保存类型T的值,或者仅仅保存null。
通过使用Optional,我们能够避免显式进行空值检测,使代码更加清晰和健壮。
1.Optional类是什么?
Optional 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。
或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念,并且可以避免空指针异常。
Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
2. 创建Optional对象
Java8提供了两种方式来创建Optional对象:
- Optional.of():of()不允许参数是null
- Optional.ofNullable():ofNullable()则没有限制
// 参数不能是null
Optional optional1 = Optional.of(1);
// ofNullable参数可以是null
Optional optional2 = Optional.ofNullable(null);
// ofNullable参数也可以不是null
Optional optional3 = Optional.ofNullable(2);
3. 判断值是否存在
使用isPresent()方法可以判断Optional对象中的值是否存在。
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
System.out.println(optional1.isPresent()); // true
System.out.println(optional2.isPresent()); // false
4. 如果值存在,则执行操作
ifPresent(Consumer consumer)方法,可以在Optional对象保存的值不为null时执行指定的操作
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
// 如果不是null,调用Consumer
optional1.ifPresent(value -> System.out.println("value is " + value));
// null,不调用Consumer
optional2.ifPresent(value -> System.out.println("value is " + value));
输出结果:
value is 1
5. 获取值或默认值
orElse(value)方法,可以在Optional对象保存的值不为null时返回原来的值,否则返回指定的默认值
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
System.out.println(optional1.orElse(1000)); // 1
System.out.println(optional2.orElse(1000)); // 1000
6. 异常处理
orElseThrow()方法可以在值不存在时抛出异常,存在时什么都不做,类似于Guava的Precoditions
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
optional1.orElseThrow(() -> new IllegalStateException());
try {
optional2.orElseThrow(() -> new IllegalStateException());
} catch (IllegalStateException e) {
e.printStackTrace();
}
相关阅读
-
Oracle imp命令详解:从基础到进阶
小编为网友们解答Oracle及imp命令详解的相关话题,下面来一起了解一下吧。 在处理Oracle数据库时,一个不可或缺的工具是 imp (导入)命令。 该命令用于将数据从一个Oracle数据库导入到另一个
-
什么是CIDR 无类域间路由
一篇方法教程,与您分享什么是CIDR的介绍,接下来IT袋网小编为大家介绍。 CIDR,全称为Classless Inter-Domain Routing(无类域间路由),是一种用于分配 IP 地址的方法,旨在更有效地利用地址空间
-
多租户SaaS平台的数据库方案详解
正文核心导读:多租户SaaS平台的数据库方案详解的教程内容,下面来一起了解一下吧。 随着云计算和SaaS(Software as a Service)模型的兴起,多租户系统成为了构建灵活、高效应用的重要架构。
-
云防火墙的类型有哪些?
今天为网友们详解云防火墙的类型有哪些的内容,很不错的方法小知识,建议收藏哦! 云防火墙有多种类型,包括: 公有云防火墙 公共云防火墙是部署在公共云平台中的虚拟网络安全设备。


