Java 对象。requireNonNull(T obj)而不是空检查和手动抛出IllegalArgumentException?

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

每当我必须检查某个方法的给定参数是否不为null时,我都会编写null检查并在null检查失败时抛出:

    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
not
NullPointerException
,原因如下所示。我们发现这更可取,因为它使断言的非空参数与意外的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))