在Java代码中执行空检查时,如果您为空值抛出IllegalArgumentExceptions,那么您将使用哪种消息模板?
我们倾向于使用这样的东西
public User getUser(String username){ if (username == null){ throw new IllegalArgumentException("username is null"); } // ... }
哪个更好:“ is null”或“ was null”,为什么?
对我来说,“是空的”感觉更自然。
由于Exception由于失败的前提条件检查而引发,因此,我认为除了陈述事实以外,还应说明已违反的 要求 。
Exception
就是说,而不是"username is null"说"username should not be null"。
"username is null"
"username should not be null"
提示,您可以使用许多旨在促进前提条件检查的库之一。番石榴中的许多代码使用com.google.common.base.Preconditions
com.google.common.base.Preconditions
在您自己的方法开始时将调用简单的静态方法以验证正确的参数和状态。这允许诸如 if (count <= 0) { throw new IllegalArgumentException("must be positive: " + count); } 被更紧凑的替代 checkArgument(count > 0, "must be positive: %s", count);
在您自己的方法开始时将调用简单的静态方法以验证正确的参数和状态。这允许诸如
if (count <= 0) { throw new IllegalArgumentException("must be positive: " + count); }
被更紧凑的替代
checkArgument(count > 0, "must be positive: %s", count);
这里更直接相关的是它具有checkNotNull,它允许您简单地编写:
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论点,番石榴的Preconditions.checkNotNull抛出NullPointerException来代替。
null
Preconditions.checkNotNull
这符合API设置的准则:
NullPointerException:应用程序应抛出此类的实例以指示该null对象的其他非法使用。
另外,这是来自 有效Java 2nd Edition 的引用 :项目60:赞成使用标准异常 :
可以说,所有错误的方法调用都可以归结为非法论点或非法状态,但其他例外通常用于 _ 某些种类_ 的非法论据和状态。如果调用者传入null了禁止使用空值的某些参数,则约定NullPointerException使用而不是IllegalArgumentException。