Java 对象。requireNonNull(T obj)而不是空检查和手动抛出IllegalArgumentException?
每当我必须检查某个方法的给定参数是否不为null时,我都会编写null检查并在null检查失败时抛出:Java 对象。requireNonNull(T obj)而不是空检查和手动抛出IllegalArgumentException?,java,exception,exception-handling,java-8,Java,Exception,Exception Handling,Java 8,每当我必须检查某个方法的给定参数是否不为null时,我都会编写null检查并在null检查失败时抛出: if (user == null) { throw new IllegalArgumentException("User can't be null."); } 然而,通过阅读一些Java8类的源代码,例如,我发现Oracle正在使用空值检查参数,然后,如果测试失败,将抛出一个 这样,通过采用以下方法,前面的代码片段应该如下所示: Objects.requir
if (user == null) {
throw new IllegalArgumentException("User can't be null.");
}
然而,通过阅读一些Java8类的源代码,例如,我发现Oracle正在使用空值检查参数,然后,如果测试失败,将抛出一个
这样,通过采用以下方法,前面的代码片段应该如下所示:
Objects.requireNonNull(user, "User can't be null.");
体积更小,可读性更强
假设我可以控制整个系统的异常处理(即使我不应该,有时处理这些未检查的异常也是业务的一部分),我是否应该用
NullPointerException
替换我的IllegalArgumentException
,并使用对象。requirennoull
而不是编写我自己的空值检查和异常引发?讨论了当一个方法接收到它不期望的空值时应该引发何种异常。有些人主张NullPointerException
,有些人主张illegargumentexception
。JDK的方式似乎是在这种情况下抛出NullPointerException
,这就是Objects.requirennoull
抛出它的原因
<>但是我不会因为这个方法修改现有代码,尽管你可能想考虑在新代码中使用<代码>对象.RealReNoNulnUng/<代码>。(在中使用它通常使代码比手动检查null和抛出异常更具可读性。)使用
对象。requirennoull(c)
是检查元素是否为null的非常优雅的方法。但是关于选择NullPointerException
还是IllegalArgumentException
-->有一个有趣的讨论。因此抛出NullPointerException
是表示引用为null的java方式
否则,您可以创建自己的方法requireNotNull()
。这很简单:
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
public static T requirennull(T obj){
if(obj==null)
抛出新的NullPointerException();
返回obj;
}
您可以通过
IllegalArgumentException
更改异常NullPointerException
,在我工作的地方,我们创建了自己的sure.notNull(Object val,String msg)
,它的功能基本相同。但是,它抛出了IllegalArgumentException
notNullPointerException
,原因如下所示。我们发现这更可取,因为它使断言的非空参数与意外的NPX明显不同。虽然我还没有在我们的代码库中完成它,但我已经考虑创建一个新的NullArgumentException
(扩展IllegalArgumentException
)并让它抛出它。这“我们发现这更可取,因为它使断言的非空参数与意外的NPX明显不同。”有点无意义-当你得到一个NPE时,你也有一个行号,因此在这个特定的案例中,你可以看到参数为空-并且对象。如果你愿意,RequireNonnoull
允许你提供一个特定的错误消息。上述讨论的最高评分答案与这里的答案一起说明了问题IllegalArgumentException
看起来更合适,因此我仍然可以将其与我的对象的“自己的版本”结合使用。RequireNotFull
,这会引发我想要的异常。小心,有时排名靠前的答案可能是最古老的;)你是对的。通过进一步搜索,我发现即使是Joshua Bloch也为使用NullPointerException
而不是IllegalArgumentException
辩护,我打开了他的书以确保这一点。现在我明白了为什么这有时被称为“圣战”问题,这两种方法都有优点。但是,这个讨论并不是这个主题的主题,所以我可能很快就会接受你的答案。如果你打算使用自己的答案,你可能希望在参数中添加\@Nullable,在返回类型中添加\@NotNull。我们在JDK中为新代码这样做,并机会主义地修改旧代码。将来JVM很可能最终会对Objects.requirennull进行内部化,这也是喜欢它的另一个原因。“我应该使用NPE还是IAE”的争论主要是一个鼠洞;这两种立场都是站得住脚的,在他们之间争论所花费的大部分精力都是白费的。当布赖恩·戈茨说他用一种方式来做这件事时,很可能你会想用这种方式来做;-)@BrianGoetz,这样,当这些空检查失败时,我更愿意采用NullPointerException
。Joshua已经在他的书中指出了对NPE
的偏好超过了IAE
,而且,通过阅读您所说的JDK的未来,我认为我有足够的证据证明这一点。顺便说一句,@OSryx answer仍然可以执行另一种参数检查。@Daniel我希望这是真的,但是有这么大的代码库,有20年的历史,厨房里有数百名厨师,不一致是不可避免的。但是,这有关系吗?这些都不是为调用方捕获而设计的异常。更重要的是,你要做任何的参数检查。我担心我们花费更多的精力来争论最好的方法来进行参数检查,而不是我们实际花费的精力。顺便说一句,对象的API。requirennoull()
允许您在链接的this()
或super()
调用中使用它:super(requirennoull(x))
。