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,"不能为空");
未完待续