java常见空指针的情况

java程序中如果变量为null,就意味着它是没有引用指向或者说指针,这个时候对这个变量做任何操作都会产生空指针异常( NullPointerException)。

下面五种情况下最容易出现空指针异常。

1.参数值为Integer等包装类型,使用时因为自动拆箱导致了空指针异常;
2.字符串比较时容易出现空指针异常;
3.对key、value不能为null的容器put为null的key、value值;
4.方法或者远程服务返回的list不是空而是null,没有进行判空,就直接调用该list的方法会出现空指针异常;
5.A对象包含B,在通过A对象的字段或者到B,没有对字段进行判空就联级调用B的方法出现空指针异常。

使用jdk1.8新特性Stream API加Optional优雅的进行判空

@org.junit.Test
public  void  demo(){
    List<Person> list = new ArrayList<>();
    list.add(new Person());
    list.add(null);
    list.add(new Person("小明",10));
    list.add(new Person("小红",12));

    // 普通写法
    for (Person person : list) {
        if(person!=null){
            System.out.println(person.getAge());
            System.out.println(person.getName());
        }
    }

    // 利用Stream API 中的 filter将队列中的空对象过滤掉,filter(Objects::nonNull)的意思是,list中的每个元素执行Objects的nonNull()方法,返回false的元素被过滤掉,保留返回true的元素。
    list.stream().filter(Objects::nonNull).forEach(person->{
        System.out.println(person.getName());
        System.out.println(person.getAge());
    });

    // 实际场景中 list本身也有可能为null, (Optional.ofNullable(list).orElseGet(() ->)该段代码的含义表            示如果list为null就执行后面两句代码,可以将日志打印到里面
    Optional.ofNullable(list).orElseGet(() -> {
        System.out.println("personList为null!");
        return new ArrayList<>();
    }).stream().filter(Objects::nonNull).forEach(person -> {
        System.out.println(person.getName());
        System.out.println(person.getAge());
    });

}

static class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

使用Assert进行字符串判空

Assert.notNull(String str,"不能为空");

在这里插入图片描述

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值