据说,穿秋裤的原因只有两个
一个是你觉得冷了
二是你妈觉得你冷了
但是……今年不太一样
一股寒潮的光临
它速度快、降温猛、特别冷
还影响南北很多省
江湖人称速冻小能手
不过寒潮再猛……
当生产环境中出现这根“空指针”的时候
就问你的头皮冒不冒汗?
常见空指针异常
级联调用时
我们在写代码的时候,不可避免的都需要调用别的方法来获取数据,这个方法可能是自己写的,也可能是别人写的,所以对于返回值就有所不同,如果方法返回值没有做处理,直接返回了个null
,那么作为调用方,就有可能会出现空指针异常了,例如:
public static void main(String[] args) {
// 当我们在获取到User信息,但没有做判断的情况下,直接获取名字就可能会导致空指针异常
userService.getUserById("123").getName();
}
使用for
循环时
这个经常会出现,使用for
循环处理集合时,不管是从别的方法调用返回的集合,还是自己写的方法使用集合时,稍微一疏忽就掉进去了,例如:
public static void main(String[] args) {
List<String> list = null;
// 直接使用就会出现空指针异常
for(String s : list){
System.out.print(s);
}
}
// 这个方法没有什么问题,但是当出现异常的时候,返回值就是null了
public List add(){
List list=null;
try {
list=new ArrayList();
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
对象直接取属性时
对象为空时,直接使用会导致,当书写复杂逻辑时,容易出现该问题
public void test(){
User user = null;
// 经过不少代码块处理的复杂逻辑;
{} {} ……{}
// 空指针异常
String name = user.getName();
}
使用包装类型时
包装类型是可以为空,而在开发中一般都推荐使用包装类型,而不是原始类型,所以这个点也容易造成空指针异常
public void test(Integer i){
// 如果传 null ,直接使用就空指针了
System.out.print(i);
}
使用equals
方法时
从未知对象调用equals
方法时,容易出现空指针异常
public static void main(String[] args) {
String testStr = null;
// 错误使用方式
if(testStr.equals("test")){
System.out.print("这种就会产生空指针异常");
}
// 正确使用方式
if("test".equals(testStr)){
System.out.print("从已知的String对象中调用equals(),而非未知对象");
}
}
使用toString
方法时
当调用空对象的toString()
方法的时候,会报空指针异常
BigDecimal bd = getPrice();
// bd为null的时候,会报空指针异常
System.out.println(bd.toString());
如何避免
- 避免从方法中返回空指针,而是返回空
collection
或者空数组。 - 从已知的
String
对象中调用equals()
,而非未知对象; - 当
valueOf()
和toString()
返回相同的结果时,使用valueOf()
代替toString()
; - 使用传
null
安全的方法和库,例如:StringUtils
工具类、Preconditions
工具类; - 使用注解
@NotNull
和@Nullable
; - 根据业务定义数据库中的字段为非空,这样就不需要判断是否非空;
- Java8中还提供了
Optional
类型,可以使用;
还有很多的注意事项,可以帮助我们规范开发,避免空指针异常,不再一一列举了,阿里发布的《Java开发手册》里面有很多,非常值得一项一项的去研读。
这篇在寒潮来临的时候写的文章,到现在才发出来……年底了,发现事有点多啊,见谅见谅
有任何问题欢迎关注公众号【Hugh的白板】私信我,一起探讨,一起学习