Objects.requireNonNull(T obj) 而不是空检查并手动抛出 IllegalArgumentException?

Objects.requireNonNull(T obj) instead of null checks and manually thrown IllegalArgumentException?

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

    if (user == null) {
        throw new IllegalArgumentException("User can't be null.");
    }

但是通过阅读源码有些Java8类如ArrayList, I found out that Oracle are using Objects.requireNonNull to check a parameter against a null value, and then, if the test fails, a NullPointerException是抛出

这样,前面的代码片段采用这种方法应该是这样的:

Objects.requireNonNull(user, "User can't be null.");

更小,更易读。

假设我可以控制系统的整个异常处理,(即使我不应该,有时处理这些未经检查的异常也是业务的一部分),我是否应该更换我的IllegalArgumentExceptionNullPointerException 并使用 Objects.requireNonNull 而不是编写我自己的空检查和异常抛出?

讨论了当方法接收到它不期望的空值时应该抛出哪种异常。有人主张NullPointerException,有人主张IllegalArgumentException。 JDK 方法似乎是在这种情况下抛出 NullPointerException,这就是 Objects.requireNonNull 抛出它的原因。

但我不会仅仅因为这种方法而修改现有代码,尽管您可能想考虑在新代码中使用 Objects.requireNonNull。 (与检查 null 并手动抛出异常相比,使用它通常会使代码更具可读性。)

使用Objects.requireNonNull(c) 是检查元素是否不为空的一种非常优雅的方法。但是有一个有趣的讨论是选择 NullPointerException 还是 IllegalArgumentException --> IllegalArgumentException or NullPointerException for a null parameter?。所以抛出 NullPointerException 是 java 表示引用为空的方式。

否则,您可以制作自己的方法requireNotNull()。很简单:

 public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

并且您可以通过 IllegalArgumentException 更改例外 NullPointerException