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

时间:2015-06-23 14:04:18

标签: java exception exception-handling java-8

每当我必须检查方法的给定参数是否不为null时,我曾经写过一个空检查,如果空检查失败,则抛出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.");

更小,更易读。

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

2 个答案:

答案 0 :(得分:11)

使用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;
    }

您可以按NullPointerException更改例外IllegalArgumentException

答案 1 :(得分:6)

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

但我不会因为这种方法而修改现有代码,尽管您可能需要考虑在新代码中使用Objects.requireNonNull。 (通常使用它会使代码更易于读取,而不是检查null并手动抛出异常。)