由于
Exception由于失败的前提条件检查而引发,因此,我认为除了陈述事实以外,还应说明已违反的 要求 。
就是说,而不是
"username is null"说
"username should not be null"。
关于使用库进行前提条件检查
提示,您可以使用许多旨在促进前提条件检查的库之一。番石榴中的许多代码使用
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
VSNullPointerException
当你的原始代码抛出
IllegalArgumentException的
null论点,番石榴的
Preconditions.checkNotNull抛出
NullPointerException来代替。
这符合API设置的准则:
NullPointerException:应用程序应抛出此类的实例以指示该null对象的其他非法使用。
另外,这是来自 有效Java 2nd Edition 的引用 :项目60:赞成使用标准异常 :
可以说,所有错误的方法调用都可以归结为非法论点或非法状态,但其他例外通常用于 _ 某些种类_
的非法论据和状态。如果调用者传入null了禁止使用空值的某些参数,则约定NullPointerException使用而不是IllegalArgumentException。



