Objects.requireNonNull(T obj) 而不是 null check 和手动抛出 IllegalArgumentException?

2022-09-02 21:45:23

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

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

但是,通过阅读一些Java 8类(如ArrayList)的源代码,我发现Oracle正在使用Objects.requireNonNull来检查参数与空值,然后,如果测试失败,则会引发NullPointerException

这样,通过采用此方法,前面的代码片段应如下所示:

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

更小,更具可读性。

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


答案 1

使用是检查元素是否不为空的一种非常优雅的方法。但是有一个有趣的讨论,关于是否选择或 --> IllegalArgumentException 或 NullPointerException 作为空参数?。因此,抛出是java表示引用为空值的方式。Objects.requireNonNull(c)NullPointerExceptionIllegalArgumentExceptionNullPointerException

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

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

并且您可以通过 更改异常。NullPointerExceptionIllegalArgumentException


答案 2

有一个关于当一个方法收到它不期望的空值时应该引发哪种异常的讨论。有人主张,有人主张。JDK的方式似乎是在这种情况下投掷,这就是为什么投掷它的原因。NullPointerExceptionIllegalArgumentExceptionNullPointerExceptionObjects.requireNonNull

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


推荐