java.lang.NullPointerException

相信对每一个java程序员来说都不陌生的,常常因为缺少一个判空导致系统各自通讯错误,异常。从java8开始,给我们提供了一个对象判空操作处理类Optional。

根据jdk8官方文档,可以知道,该根据类存在于java.util下的final类,也就是说是官方提供给我们的一个工具类。
当然首先我们来看下具体的使用方法:
Optional<String> optionalS = Optional.of(new String("baomw"));
System.out.println(optionalS.get());
如上,代码非常简单:效果如下

核心api说明如下:
方法 描述

api 说明
of 把指定的值封装为Optional对象,如果指定的值为null,则抛出NullPointerException
ofNullable 把指定的值封装为Optional对象,如果指定的值为null,则创建一个空的Optional对象
get 如果创建的Optional中有值存在,则返回此值,否则抛出NoSuchElementException
isPresent 如果创建的Optional中的值存在,返回true,否则返回false
ifPresent 如果创建的Optional中的值存在,则执行该方法的调用,否则什么也不做
orElse 如果创建的Optional中有值存在,则返回此值,否则返回一个默认值
orElseGet 如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值
empty 创建一个空的Optional对象
orElseThrow 如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常
filter 如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象
map 如果创建的Optional中的值存在,对该值执行提供的Function函数调用
flagMap
如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
/** * Common instance for {@code empty()}. */ private static final Optional<?>
EMPTY = new Optional<>(); /** * Returns an {@code Optional} with the specified
present non-null value. * * @param <T> the class of the value * @param value
the value to be present, which must be non-null * @return an {@code Optional}
with the value present * @throws NullPointerException if value is null */
public static <T> Optional<T> of(T value) { return new Optional<>(value); } /**
* Returns an {@code Optional} describing the specified value, if non-null, *
otherwise returns an empty {@code Optional}. * * @param <T> the class of the
value * @param value the possibly-null value to describe * @return an {@code
Optional} with a present value if the specified value * is non-null, otherwise
an empty {@code Optional} */ public static <T> Optional<T> ofNullable(T value)
{ return value == null ? empty() : of(value); } /** * If a value is present in
this {@code Optional}, returns the value, * otherwise throws {@code
NoSuchElementException}. * * @return the non-null value held by this {@code
Optional} * @throws NoSuchElementException if there is no value present * *
@see Optional#isPresent() */ public T get() { if (value == null) { throw new
NoSuchElementException("No value present"); } return value; } /** * Return
{@code true} if there is a value present, otherwise {@code false}. * * @return
{@code true} if there is a value present, otherwise {@code false} */ public
boolean isPresent() { return value != null; }
核心api及关键点如上,注意比较of 和ofNullable经常会有出现使用Optional.of创建Optional对象时报空指针,因为(如下)是of
创建Optional对象的构造方法,发现如果传入的value为null时,会抛出一个空指针异常。
private Optional(T value) { this.value = Objects.requireNonNull(value); }
public static <T> T requireNonNull(T obj) { if (obj == null) throw new
NullPointerException(); return obj; }
而对于ofNullable上述源码可以看出,有一个三目表达式,如果value为空,则创建一个空的Optional对象。
public static <T> Optional<T> ofNullable(T value) { return value == null ?
empty() : of(value); }
如上可以根据实际需要适当选取构造方法。

经常在代码中会有这样的写法,如果值为空就给个默认值的情况:
if(str == null){ return new String("baomw"); }else{ return str; }
当然如果用Optional.orElse(method)就使得这样子的写法异常简单。
return Optional.ofNullable(str).orElse(new String("baomw"));
使用orElse方法,就很好的解决了,如果值不为空则返回,否则执行orElse里面的方法并返回其返回值。

关于更多其他api的详细用法,有兴趣的可以自己试一下。

技术
©2019-2020 Toolsou All rights reserved,
vue项目中对axios的全局封装单个按键控制多种流水灯状态软件测试之BUG描述随机森林篇 R语言实现TP6验证器的使用示例及正确验证数据C语言编程之查找某学号学生成绩一文揭秘阿里、腾讯、百度的薪资职级c语言的5种常用排序方法2021年1月程序员工资统计,平均14915元Bug数能否做为技术人员考核的KPI?