0.参考
参考文章:Objects.requireNonNull方法说明
1.源码
/**
* Checks that the specified object reference is not {@code null}. This
* method is designed primarily for doing parameter validation in methods
* and constructors, as demonstrated below:
* <blockquote><pre>
* public Foo(Bar bar) {
* this.bar = Objects.requireNonNull(bar);
* }
* </pre></blockquote>
*
* @param obj the object reference to check for nullity
* @param <T> the type of the reference
* @return {@code obj} if not {@code null}
* @throws NullPointerException if {@code obj} is {@code null}
*/
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
该方法是Objects类的一个静态方法,当参数值为空值时,直接抛出NPE
2.为什么使用这个方法?
该方法的作用是进行非空检查,如果参数值为null,抛出NPE
但就算不使用该方法,程序也同样会抛出NPE,为什么还要使用这个方法呢?
原因在于:遵循Fail-Fast编程思想,让错误尽可能早的出现,不要等到很多工作执行到一半才抛出异常。
以下方代码为例:
public void methodA(String paramA){
methodB(paramA);
}
public boolean methodB(String paramA){
//省略一部分代码...
if(paramA.contentEquals("A")){
return true;
}else{
return false;
}
}
如上有methodA和methodB两个方法,methodA以paramA作为参数,调用methodB
如果不使用Objects.requireNonNull方法,那么在传入空值时,methodB的前半部分代码都会被执行并不会抛出异常,直到执行至第九行,方法才会抛出异常。
这样在DEBUG时,会耗费更多不必要的时间,而且前面的执行便完全失去了意义。
如果使用Objects.requireNonNull对paramA进行非空检查,即:
public void methodA(String paramA){
methodB(Objects.requireNonNull(paramA));
}
那么程序在执行到第二行,且未执行methodB时,便已经抛出了异常。这样当我们进行DEBUG时就会明确许多,少走许多弯路。