妈妈再也不用担心我会出现NullPointerException空指针了,java处理空指针,java利用Lambda处理空指针

Optional 真香

下面是以前不会用 Optional 自己想着一直实现

这里就不对 Optional 做介绍了

实体类:

public class User
{
    private User son;
    private String name
	// 忽略get set    
}

测试:

@Test
public void test1()
{
    User user = new User();
    // 这样获取难免会出现空指针
    user.getSon().getSon().getSon().getSon().getSon();
    // 先判断再获取
    if(null != user.getSon() && null !=user.getSon().getSon() && null != user.getSon().getSon().getSon() && null != user.getSon().getSon().getSon().getSon())
   {
  		// 这样就不会出现空指针了, 但是写法很麻烦
  		user.getSon().getSon().getSon().getSon().getSon();
   }
   // java8 新出了一个 Optional 类,这里我不太会用,但是我感觉像上面的情况还是很繁琐   真喜欢 js中的 ?.语法 根本不会出现空指针这种情况
}

自己利用java8Lambda的特性封装方法

public class LambdaUtils
{
    /**
     * 处理在获取对象的时候,可能出现空指针的情况
     * 如果出现空指针,则返回  null
     * @param supplier      获取值
     * @param <T>
     * @return  正常情况下返回 预期值
     *          出现空指针 返回 null
     */
    public static <T> T nullHandle(Supplier<T> supplier)
    {
        try
        {
            return supplier.get();
        }
        catch (NullPointerException e)
        {
            return null;
        }
    }

    /**
     * 处理在获取对象的时候,可能出现空指针的情况
     * 如果出现空指针,则返回  默认值
     * @param supplier      获取值
     * @param <T>
     * @param def   默认值
     * @return  正常情况下返回 预期值
     *          出现空指针 返回 默认值
     */
    public static<T> T nullHandle(Supplier<T> supplier, T def)
    {
        try
        {
            return supplier.get();
        }
        catch (NullPointerException e)
        {
            return def;
        }
    }
}

测试

@Test
public void test()
{
    User user = new User();
    User u1 = LambdaUtils.nullHandle(() -> user.getSon().getSon().getSon().getSon().getSon());
    User user1 = new User();
    User user2 = new User();
    User user3 = new User();
    User user4 = new User();
    User user5 = new User();
    user.setSon(user1);
    user1.setSon(user2);
    user2.setSon(user3);
    user3.setSon(user4);
    user4.setSon(user5);
    User u2 = LambdaUtils.nullHandle(() -> user.getSon().getSon().getSon().getSon().getSon());
    System.out.println(u1); // null
    System.out.println(u2); // User(userName=null, age=null, sex=null, phone=null, son=null)
   

    // 试例
    // 多数情况下,我们只是想它匹配上才进入if, 并不想关注它会不会空指针
    // 但是下面这样写就难免会出现空指针
    if("小胖".equals(user.getSon().getSon().getSon().getName()))
    {
        System.out.println(user);
	}
	// 这样就不用关心它会不会出现空指针了
	if(LambdaUtils.nullHandle(() -> "小胖".equals(user.getSon().getSon().getSon().getName()), false))
	{
		System.out.println(user);
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值