由于Exception
由于前置条件检查失败而引发了,我认为您应该说明违反的要求,而不是简单地陈述一个事实。
也就是说,与其说,不如"username is null"
说"username should not be null"
。
关于使用库进行前置条件检查
作为提示,您可以使用许多旨在促进前提条件检查的库之一。Guava 中的许多代码使用com.google.common.base.Preconditions
在您自己的方法开始时调用简单的静态方法以验证正确的参数和状态。这允许诸如
if (count <= 0) {
throw new IllegalArgumentException("must be positive: " + count);
}
换成更紧凑的
checkArgument(count > 0, "must be positive: %s", count);
这里更直接相关的是它具有checkNotNull
,它允许您简单地编写:
checkNotNull(username, "username should not be null");
请注意上面的代码读起来是多么自然,详细的消息明确说明了违反的要求。
陈述事实的替代方案更尴尬:
// Awkward!
checkArgument(count > 0, "is negative or zero: %s", count);
checkNotNull(username, "username is null");
此外,这也可能不太有用,因为客户可能已经意识到这一事实,并且异常并不能帮助他们弄清楚实际需求是什么。
对IllegalArgumentException
_NullPointerException
虽然您的原始代码会抛出IllegalArgumentException
参数null
,但 Guava 会Preconditions.checkNotNull
抛出NullPointerException
。
这符合 API 设置的指南:
NullPointerException
: 应用程序应该抛出这个类的实例来指示null
对象的其他非法使用。
此外,这里引用Effective Java 2nd Edition:第 60 条:支持使用标准异常:
可以说,所有错误的方法调用都归结为非法参数或非法状态,但其他异常通常用于某些类型的非法参数和状态。如果调用者传入null
了一些禁止 null 值的参数,则约定将NullPointerException
其抛出而不是IllegalArgumentException
.