PRELOADER

当前文章 : 《避免出现空指针的几种技巧》

5/5/2019 —— 

前言

 当一个变量的值为 null 时,在 Java 里面表示一个不存在的空对象,没有实际内容,没有给它分配内存,null 也是对象成员变量的默认值。所以,一个对象如果没有进行初始化操作,则调用这个对象的方法或者变量,就会出现空指针异常。空指针它是属于运行时异常 RuntimeException 的子类,不是捕获型的,只有在程序运行时才报出来,而且会造成程序中断。

字符串比较常量放前面

1
2
3
4
5
6
7
8
  //容易造成空指针异常
if(status.equals(system)){

}
//规范写法
if(SUCCESS.equals(status)){

}

初始化默认值

1
2
3
  Object object = new Object();

String s = StringUtils.EMPTY;

返回空集合

1
2
3
4
public List<SysLog> getSysLogList(){
List<SysLog> list = sysLogMapper.getSysLogList();
return list == null ? new ArrayList<SysLog>() : list;
}

Assert(断言)

 测试代码或者调试程序时,总会做出一些假设,断言就是用于在代码中捕捉这些假设。

1
2
3
4
5
6
7
8
9
10
11
12
//Java 中自带的断言关键字:assert,例:

assert userId == null : "用户ID不能为空";

//默认是不启动断言检查的,需要要带上 JVM 参数:-enableassertions 才能生效。

//Spring中的Assert

public List<SysLog> getSysLogListByUserId(String userId) {
Assert.notNull(userId, "用户ID不能为空");
return sysLogMapper.getSysLogListByUserId(userId);
}

使用Java8新特性Optional

方法说明

  • of 把指定的值封装为Optional对象,如果指定的值为null,则抛出NullPointerException
  • empty 创建一个空的Optional对象
  • ofNullable 把指定的值封装为Optional对象,如果指定的值为null,则创建一个空的Optional对象
  • get 如果创建的Optional中有值存在,则返回此值,否则抛出NoSuchElementException
  • orElse 如果创建的Optional中有值存在,则返回此值,否则返回一个默认值
  • orElseGet 如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值
  • orElseThrow 如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常
  • filter 如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象
  • map 如果创建的Optional中的值存在,对该值执行提供的Function函数调用
  • flagMap 如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
  • isPresent 如果创建的Optional中的值存在,返回true,否则返回false
  • ifPresent 如果创建的Optional中的值存在,则执行该方法的调用,否则什么也不做
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

// 参数不能是null
Optional<Integer> optional1 = Optional.of(1);
// 参数可以是null
Optional<Integer> optional2 = Optional.ofNullable(null);
// 参数可以是非null
Optional<Integer> optional3 = Optional.ofNullable(2);

//Optional.empty():所有null包装成的Optional对象
Optional<Integer> optional1 = Optional.ofNullable(null);
Optional<Integer> optional2 = Optional.ofNullable(null);
System.out.println(optional1 == optional2);// true
System.out.println(optional1 == Optional.<Integer>empty());// true

//isPresent():判断值是否存在
Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
System.out.println(optional1.isPresent() == true);
System.out.println(optional2.isPresent() == false);