为什么要使用Objects.requireNonNull()
?
我注意到Oracle JDK中使用了许多Java 8方法,如果给定的对象(参数)是NullPointerException
内部抛出null
的NullPointerException
.
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
Run Code Online (Sandbox Code Playgroud)
但是null
如果NullPointerException
对象被解除引用,则无论如何都会抛出.那么,为什么要进行额外的空检查和抛出
Objects.requireNonNull()
?
一个明显的答案(或好处)是它使代码更具可读性,我同意.我很想知道Objects.requireNonNull()
在方法开头使用的任何其他原因
.
我在Stackoverflow上多次看到这段代码:
public void doStuff(Object anObject) {
if (anObject == null) {
throw new NullPointerException("anObject can't be null");
}
//rest of the function
}
Run Code Online (Sandbox Code Playgroud)
这是一个针对null
参数的保护子句,因为传递null
给需要参数为非null的函数将导致a NullPointerException
.
我理解保护条件在其他情况下验证参数的重要性(即检查日期范围,负货币值,无效字符串大小等).
但是,在null
具体情况下是不是NullPointerException
多余的?这与NullPointerException
后来运行时抛出一个不同之处有什么不同?
注意:我用语言无关的方式询问,因为模式本身可以应用于Java和C#.
据我所知,在更改某些对象状态之前,我们使用Guava Preconditions快速失败(这是stackoverflow的一个很好的答案).这很好.但是它会抛出运行时异常,这不是应用程序用户最喜欢的异常(500错误等等......).所以我需要你在设计方面给我一些帮助.
我有一个声明许多方法的接口.每个方法都有必须控制的参数(例如:not null).所以在实现类中我使用如下指令:
Preconditions.checkNotNull(fooObj);
Run Code Online (Sandbox Code Playgroud)
但是,调用此API的程序可能会因运行时异常而崩溃,在本例中为NullPointerException.
那么你如何处理这些未经检查的异常呢?
谢谢.
--------编辑应用层:
数据访问层
API声明交换DTO的方法
使用Guava实现API并检查参数的过程
Web服务取决于流程层