你有没有被这跟“针”扎的头皮冒汗?

244 阅读3分钟

据说,穿秋裤的原因只有两个

一个是你觉得冷了

二是你妈觉得你冷了

但是……今年不太一样

一股寒潮的光临

它速度快、降温猛、特别冷

还影响南北很多省

江湖人称速冻小能手

不过寒潮再猛……

当生产环境中出现这根“空指针”的时候

就问你的头皮冒不冒汗?

常见空指针异常

级联调用时

我们在写代码的时候,不可避免的都需要调用别的方法来获取数据,这个方法可能是自己写的,也可能是别人写的,所以对于返回值就有所不同,如果方法返回值没有做处理,直接返回了个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的白板】私信我,一起探讨,一起学习