首页 > 技术文章 > NPE问题的处理

SkyTreeDelivery 2021-05-25 20:37 原文

NPE,即NullPointerException,是开发中最常见的问题之一,有必要知道如何正确地处理NPE。

有6种情况下会出现NPE问题

  1. 在空对象上调用实例方法

  2. 访问空对象上的字段

  3. 抛出空异常

  4. 数组为null是访问数组长度

  5. 数组为null时访问数组中下标位置

  6. 对空对象进行同步或在同步块内使用null

    @Test
    public void test4(){
        // 抛出null会触发空指针异常(NPE)
        throw null;
    }
    
    @Test
    public void test5(){
        // 在同步块中对null对象加锁或引发NPE
        Object obj = null;
        synchronized (obj){
            //.....
        }
    }
    

Note: NPE问题一定是由逻辑错误触发的,因此使一定可以通过编码解决的,对于NPE问题,要做到早暴露,早修复,严禁使用trycatch掩盖编码错误。

对于程序的调用方开发方,要么是调用方对接口的调用出现了逻辑错误,要么是开发方的代码存在逻辑错误。

  1. 如果是调用方的问题,这个问题被调用方式无法解决的,属于参数校验的检验内容,通过对参数的校验,及时发现NPE问题同时提高充分的信息提示调用方修改,例如返回错误码和错误信息。
  2. 如果是开发方代码存在问题,就要修复产生NPE问题的代码。如加入判空,使用空的集合代替null。

想要预防好NPE问题,有如下建议:

  1. 对于调用equal方法判断对象相等的情景,在已知不为空的对象上调用,如对于字符串判断相等,使用字符串调用equal而不是未知对象。
  2. 对于返回字符串的情况,返回空白字符串("")而不是null。
  3. 对于返回容器类的情况,返回空容器(Collections.EMPTY_LIST)而不是null。
  4. 使用@NotNull@Nullable提示调用者所需的参数,注解本身不会检查代码,但是可以有效提示调用者,同时在使用一些静态检查框架的时候起作用,也可以再JavaDoc文档中自动标识。
  5. 在定义变量的时候赋予合适的初始值,如("")或者空的容器(Collections.EMPTY_LIST)。
  6. 使用Optional

参考

避开NullPointerException的10条建议

NullPointerException—廖雪峰

推荐阅读