跟踪JDK源码可以看到很多地方有使用Objects.requireNonNull来确保对象非空。

我们先看一下源码

public static <T> T requireNonNull(T obj) {  
    if (obj == null)  
        throw new NullPointerException();  
 return obj;  
}

public static <T> T requireNonNull(T obj, String message) {  
    if (obj == null)  
        throw new NullPointerException(message);  
 return obj;  
}

public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {  
    if (obj == null)  
        throw new NullPointerException(messageSupplier.get());  
 return obj;  
}

可以看到,源码里面会抛出空指针异常。如果不使用这个方法,最终执行的时候也是会抛出空指针异常,那么我们用它的意义是?

  • 提前检查。在运行时抛出NPE,我们可能定位不到它的源头,对象传入和它被使用可能相差了很久,也可能会导致代码进入执行了一半不能完全执行的错误。
  • 可读性。其实我们也可以使用if (xx != null) {}来进行判断,并抛出我们想要的异常。但是这样会多出几行代码。原来的赋值代码如果是this.name = name;,我们可以变更为this.name = Objects.requireNonNull(name, "name is null");,这样在不增加代码行的基本上,代码依然可以保持比较简约的状态。这是一种优雅的方式。

使用的时候,建议附加message,以方便定位问题