对参数可能为空引起空指针异常的解决方案;

一、optional类

Optional.of(user) //user为空会报空指针异常

Optional.ofNullable(user) //不会报异常

1、访问Optional对象的值

必须对使用get方法校验获取值是否为空,否则报NoSuchElementException

is.Persent() //默认flase,如果有值为true

该方法除了执行检查,还接受一个Consumer(消费者) 参数,如果对象不是空的,就对执行传入的 Lambda 表达式

2、获取值时,如果为空返回默认值

Optional 类提供了 *orElse()*如果有值则返回该值,否则返回传递给它的参数值:

@Test
public void whenEmptyValue_thenReturnDefault() {
    User user = null;
    User user2 = new User("anna@gmail.com", "1234");
    User result = Optional.ofNullable(user).orElse(user2);

    assertEquals(user2.getEmail(), result.getEmail());
}

*orElseGet()*会在有值的时候返回值,如果没有值,它会执行作为参数传入的 Supplier(供应者) 函数式接口,并将返回其执行结果

User result = Optional.ofNullable(user).orElseGet( () -> new user("2231","21345"));

user为空时new user对象并返回;

orElseGet()与orElse()

两个 Optional 对象都包含非空值,两个方法都会返回对应的非空值。不过,orElse() 方法仍然创建了 User 对象。与之相反,*orElseGet()* 方法不创建 **User** 对象。

3、获取值时,如果为空返回异常

Optional 还定义了 orElseThrow() API —— 它会在对象为空的时候抛出异常,而不是返回备选的值:

@Test(expected = IllegalArgumentException.class)
public void whenThrowException_thenOk() {
    User result = Optional.ofNullable(user)
      .orElseThrow( () -> new IllegalArgumentException());
}

如果 user 值为 null,会抛出 IllegalArgumentException

4、转换值和过滤值

转换值

Optional 类的链式方法
public class User {    
    private String position;

    public Optional<String> getPosition() {
        return Optional.ofNullable(position);
    }
      //将返回的值包装在 Optional 中,
    //...
}
//返回值为解除包装的String值
public void getValue{
  ....
  String position =
 Optioonal.ofNullable(user).flatMap(
  u->u.getPosition().orElse("....."))
}

过滤值

*filter()* 接受一个 *Predicate* 参数,返回测试结果为 true 的值。如果测试结果为 false,会返回一个空的 Optional

二、异常类捕获或validate

全局异常类

自定义异常类继承RuntimeException类,

定义异常类中所要注入的信息(成员变量);

全局异常类:@controllerAdvice

在方法上捕获异常类型

@ExceptionHandler(value=异常类.class)

方法(异常类 e){

e.getxxx();

//捕获异常之后,所要执行的逻辑

}

@validate 与@valid的校验参考

三、工具包

String.valueof()

Strings.isNullOrEmpty(str); // from spring-core

CollectionUtils.isEmpty(col);// from spring-core

StringUtils.isEmpty() //commons.lang3

Assert类:Assert.notNull()、Assert.hasLength()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值