1.什么是NPE?
NPE,即
NullPointerException,是开发中最常见的问题之一,有必要知道如何正确地处理NPE。
对于
Java 开发者来说,
null
是一个令人头疼的类型,一不小心就会发生
NPE (空指针) 问题。也是
Java 语言为人诟病的一个重要原因之一。在我们消除可恶的
NPE 问题之前我们要回顾一下 Java 中 null 的概念。
2.有6种情况下会出现NPE问题
在空对象上调用实例方法
public static void test4(){
List list =null;
int aaa=list.size();
}
访问空对象上的字段
public static void test5(){
List<String> list =null;
String aaa=list.get(0);
}
抛出空异常
public static void test1(){
throw null;
}
空字符比较
public static void test3(){
String str = "this is a test";
boolean flag = str.equals("this is a test");
System.out.println("===equals result====" + flag);
str = null;
flag = str.equals("this is a test");
System.out.println("===equals result====" + flag);
}
直接return null
public static String test6(){
return null;
}
对空对象进行同步或在同步块内使用null
public static void test2(){
Object obj = null;
synchronized (obj){
//.....
}
}
Note: NPE问题一定是由
逻辑错误触发的,因此使一定可以通过编码解决的,对于NPE问题,要做到
早暴露,早修复,严禁使用
try catch掩盖编码错误。
对于程序的
调用方和
开发方,要么是调用方对接口的调用出现了逻辑错误,要么是开发方的代码存在逻辑错误。
- 如果是调用方的问题,这个问题被调用方式无法解决的,属于参数校验的检验内容,通过对参数的校验,及时发现NPE问题同时提高充分的信息提示调用方修改,例如返回错误码和错误信息。
- 如果是开发方代码存在问题,就要修复产生NPE问题的代码。如加入判空,使用空的集合代替null。
3.如何预防好NPE问题?
- 对于调用equal方法判断对象相等的情景,在已知不为空的对象上调用,如对于字符串判断相等,使用字符串调用equal而不是未知对象。
- 对于返回字符串的情况,返回空白字符串("")而不是null。
- 对于返回容器类的情况,返回空容器(Collections.EMPTY_LIST)而不是null。
- 使用@NotNull和@Nullable提示调用者所需的参数,注解本身不会检查代码,但是可以有效提示调用者,同时在使用一些静态检查框架的时候起作用,也可以再JavaDoc文档中自动标识。
- 在定义变量的时候赋予合适的初始值,如("")或者空的容器(Collections.EMPTY_LIST)。
- 使用Optional