在Java代码中执行空检查,并且为空值抛出IllegalArgumentExceptions时,您使用什么类型的消息模板?
我们倾向于使用这样的东西
public User getUser(String username){
if (username == null){
throw new IllegalArgumentException("username is null");
}
// ...
}
更好的是:“为空”或“为空”,为什么?
对我而言,“无效”感觉更自然。
答案 0 :(得分:15)
由于前置条件检查失败导致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
vs NullPointerException
当您的原始代码在IllegalArgumentException
个参数上抛出null
时,Guava的Preconditions.checkNotNull
会抛出NullPointerException
。
这符合API设定的指导原则:
NullPointerException
:应用程序应抛出此类的实例以指示null
对象的其他非法用法。
此外,这里引用了 Effective Java 2nd Edition:第60项:赞成使用标准例外:
可以说,所有错误的方法调用都归结为非法争论或非法状态,但其他例外标准用于 某些种类 的非法参数和状态。如果调用者在某些禁止空值的参数中传递
null
,则约定表示抛出NullPointerException
而不是IllegalArgumentException
。
答案 1 :(得分:5)
为null ,因为参数仍为null ..
但是,为什么不简单地抛出没有消息的NullPointerException?
答案 2 :(得分:0)
我建议说
if (userName == null) {
throw new IllegalArgumentException("username == null");
}
因为这是致命的,程序员无论如何都必须看它。在异常消息中引用有问题的代码片段是我能想象到的最简洁的事情。
答案 3 :(得分:0)
我倾向于写这个:
public User getUser(String username) {
if (username.length() == 0) {
throw new IllegalArgumentException("username is empty");
}
// ...
}
这可以一石二鸟。首先,它检测用户名是空字符串的情况,(为了参数)我假设是一个错误。其次,如果参数为null
,尝试发送length
来电将会提供NullPointerException
。
对于记录,要为意外null
投掷的预期例外是NullPointerException
。如果您不使用它的主要原因是NPE通常没有消息,请将其编码为:
public User getUser(String username){
if (username == null){
throw new NullPointerException("username is null");
}
if (username.length() == 0) {
throw new IllegalArgumentException("username is empty");
}
// ...
}
为什么要在这里使用NPE?因为NPE几乎总是向其他类型的参数验证错误指出不同类型的问题;例如尚未初始化的字段或数组单元格或未正确处理的“可选”值。
最后回答问题:
哪个更好:
"is null"
或"was null"
,为什么?
这是一个意见问题,但我会写"is null"
。