跟踪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,以方便定位问题
1条评论