由于抛出了一个失败的前置条件检查的异常,我认为你应该陈述被违反的要求,而不仅仅是陈述一个事实。
也就是说,不要说 "username is null"
,而是说"username should not be null"
。
关于使用库进行前置条件检查
作为一个提示,您可以使用许多旨在简化前置条件检查的库之一。Guava中的许多代码都使用com.google.common.base.Preconditions
。
Simple static methods to be called at the start of your own methods to verify correct arguments and state. This allows constructs such as
if (count <= 0) {
throw new IllegalArgumentException("must be positive: " + count);
}
to be replaced with the more compact
checkArgument(count > 0, "must be positive: %s", count);
在这里更直接相关的是它具有checkNotNull
,这使得您可以简单地编写:
checkNotNull(username, "username should not be null");
请注意上述代码的自然语言表达,详细说明了违反的{{requirement}}。
叙述事实的替代方法更加尴尬:
// Awkward!
checkArgument(count > 0, "is negative or zero: %s", count);
checkNotNull(username, "username is null");
此外,这也可能不太有用,因为客户端可能已经意识到这一事实,而异常并不能帮助他们弄清楚实际要求是什么。
关于IllegalArgumentException
和NullPointerException
虽然您的原始代码在null
参数上抛出 IllegalArgumentException
,但Guava的Preconditions.checkNotNull
会抛出NullPointerException
。
这符合API设置的指南:
NullPointerException
:应用程序应该抛出此类的实例来指示null
对象的其他非法用途。
此外,以下是《Effective Java第二版:条款60:倾向于使用标准异常》中的一句话:
可以说,所有错误的方法调用都归结为非法参数或非法状态,但是对于某些特定类型的非法参数和状态,标准上使用其他异常。如果调用者在禁止使用null值的某个参数中传递了null
,则约定应抛出NullPointerException
而不是IllegalArgumentException
。