【发布时间】:2015-06-23 14:04:17
【问题描述】:
每当我必须检查方法的给定参数是否不为空时,我都会编写一个空检查并在空检查失败时抛出IllegalArgumentException:
if (user == null) {
throw new IllegalArgumentException("User can't be null.");
}
但是,通过阅读一些 Java 8 类的源代码,例如 ArrayList,我发现 Oracle 正在使用 Objects.requireNonNull 来检查一个参数是否为空值,然后,如果测试失败,一个 @ 987654324@ 被抛出。
这样,早期的代码sn-p采用这种方式应该是这样的:
Objects.requireNonNull(user, "User can't be null.");
更小,更易读。
假设我可以控制系统的整个异常处理(即使我不应该,有时处理这些未经检查的异常也是业务的一部分),我是否应该将我的IllegalArgumentException 替换为NullPointerException 并使用 Objects.requireNonNull 而不是自己编写 null 检查和异常抛出?
【问题讨论】:
-
我们在 JDK 中为新代码这样做,并适时调整旧代码。并且很有可能在未来 JVM 最终会内化 Objects.requireNonNull,这也是喜欢它的另一个原因。 “我应该使用 NPE 还是 IAE”的争论主要是一个鼠洞;这两种立场都是站得住脚的,在它们之间争论的大部分努力都白费了。
-
当 Brian Goetz 说他以一种方式做事时,很可能这就是您想要做的方式 ;-)。
-
@BrianGoetz,这样当这些空检查失败时,我更愿意采用
NullPointerException。 Joshua 在他的书中已经说明了对NPE的偏好,而不是IAE,而且,通过阅读您对 JDK 未来的看法,我认为我有足够的证据可以做到这一点。顺便说一句,@OSryx 的答案仍然有效,可以实现另一种参数检查。 -
@Daniel 我希望这是真的,但是有一个拥有 20 年历史的大型代码库和数百名厨师在厨房里,不一致是不可避免的。但是,有关系吗?这些不是旨在被调用者捕获的异常。更重要的是您要进行任何参数检查。我担心我们花费更多的精力来争论进行论证检查的最佳方式,而不是我们实际花费的时间。
-
顺便说一句,
Objects.requireNonNull()的 API 允许您在链式this()或super()调用中使用它:super(requireNonNull(x))。
标签: java exception exception-handling java-8