什么是空指针异常?
空指针异常指的是当前的对象指向了一段null
的内存区域,而开发者用null
进行了其他操作,引发的JVM堆栈异常。
编译时程序无法推断出这个对象是否会为null
,而在程序运行的时候,它执行了null
所不具备的能力,这个时候JVM会向你抛出NullPointException
,告诉你,这个地方的引用是空的,无法继续往下执行了。
经典案例
User
package exception;
import lombok.Data;
import java.util.Collections;
import java.util.List;
@Data
public class User {
private String userName;
private String password;
private Integer age;
/**
* 返回空集合,用于演示NPE
* @return
*/
public static List<User> getNullInstances(){
return null;
}
}
- 业务对象为空,导致程序报NPE
User user = getDataById(100);
// 如果根据id:100无法查询到具体的User实例,那么此时的user就是null,那么null.getxxx()就会触发NPE了
String userName = user.getUserName();
- 集合操作时没有进行判空,导致程序报NPE
List<User> userList = User.getNullInstances();
System.out.println(userList.size());
- 回收资源的时候,没有进行判空处理
BufferedReader bufferedReader = null;
try {
File file = new File("C:\\Users\\95152\\Desktop\\sql.txt");
FileReader fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);
String readLine = bufferedReader.readLine();
System.out.println(readLine);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 这里的bufferedReader可能为空,直接调用close可能会报错
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
高发区域
- 进行数据库查询操作时,未进行判空就直接使用,容易引发NPE
- 远程调用或者Http调用第三方接口时,未进行判空就进行了下一步处理,容易引发NPE
- 从中间件获取数据时,未进行判空就直接处理,容易引发NPE
- 集合操作时,使用了null作为了操作目标,容易引发NPE
- toString()
如何保持代码的鲁棒性,避免NPE?
- 对对象或者集合进行操作时,需要检验是否会出现空的情况,对对象或者集合判空校验。
- 如果编写了工具类有定义返回的结果集,那么不要直接返回
null
,抛出异常或者返回空对象或许更加好 - 使用Optional
- 使用断言
- String可以使用StringUtils.isBlank()进行判空,集合可以使用CollectionUtils.isEmpty()进行判空
- JDK7提供了一个Objects类,使用Objects.isNull()可以帮助你写出可读性更友好的代码
网友评论