一、什么是空指针异常?
空指针异常(Null Pointer Exception,NPE)是 Java 中最常见的异常之一。尽管其原因显而易见,但开发人员经常忽略或未能及时采取措施,这可能导致程序崩溃或产生不可预测的行为。
二、空指针场景
为了避免 NPE,程序员应该注意以下场景:
- 返回类型为基本数据类型时,如果返回的是包装数据类型的对象,自动拆箱有可能产生 NPE;
- 当对象为空时调用方法,比如
Object.getProperty()
; - 集合中的元素为空,即使使用了
CollectionUtils.isNotEmpty()
判空,取出的数据元素也有可能为 null; - 级联调用时,如果其中一个对象为空,会抛出空指针异常;
- RPC 远程调用返回的数据对象为空。
三、Optional概述
Optional 是 Java 8 中引入的类,用于描述值存在或不存在的情况。它可以存储任意类型的值,或表示空值。使用 Optional 类可以避免传递和检查 null 值,提高代码的健壮性和可读性。
四、Optional常用属性
基本使用方式如下:
<code>Optional.ofNullable(需要判断的对象).ifPresent(具体操作)</code>
4.1 检查Optional是否有值
empty()
: 返回一个空的 Optional 实例;of(T value)
: 创建一个包含非 null 值的 Optional 对象;ofNullable(T value)
: 创建一个包含指定值的 Optional 对象,允许值为 null;get()
: 获取 Optional 对象中的值,可能抛出 NoSuchElementException 异常;isPresent()
: 判断 Optional 对象是否有值。
4.2 Optional的链式调用
通过 map()
、flatMap()
和 filter()
方法进行链式调用,对 Optional 的值进行操作。
4.3 orElse默认操作
orElse(T other)
: 如果 Optional 对象不包含值,则返回指定的默认值;orElseGet(Supplier<? extends T> other)
: 如果 Optional 对象不包含值,则返回由指定的 Supplier 生成的默认值;orElseThrow(Supplier<? extends X> exceptionSupplier)
: 如果 Optional 对象不包含值,则抛出由指定的 Supplier 产生的异常。
五、Optional的优点和应用场景
- 避免空指针异常;
- 优雅的代码处理;
- 显式地指出变量可能为空;
- 对集合的处理效率更高。
下面是几个使用 Optional 类过滤集合中的 null 值的示例。
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class ListUtils {
public static List<String> filterNullValues(List<String> list) {
return list.stream()
.filter(str -> str != null)
.map(Optional::ofNullable)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
}
}
六、总结
6.1 Optional的总结
- Optional 是 Java 8 中的新特性,用于避免空指针异常,提高代码的可读性和健壮性;
- 使用时需要注意值是否存在,避免抛出 NoSuchElementException 异常。
6.2 Optional的发展趋势
随着函数式编程的流行和 Java 9、Java 10 的发布,Optional 类也会得到更多的应用和完善。在函数式编程中,对于空值的处理变得越来越重要,Optional 类的优势将得到更充分的发挥。
来源:https://juejin.cn/post/7300550397780164617
推荐:https://chencoding.top:8090
暂无评论内容