空检查错误消息为“is null”或“was null”
-
26-09-2019 - |
题
在 Java 代码中进行 null 检查时,如果您为 null 值抛出 IllegalArgumentExceptions,您使用哪种消息模板?
我们倾向于使用这样的东西
public User getUser(String username){
if (username == null){
throw new IllegalArgumentException("username is null");
}
// ...
}
什么是更好的 :“为空”或“为空”,为什么?
对我来说“为空”感觉更自然。
解决方案
自从 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
参数,番石榴的 Preconditions.checkNotNull
投掷 NullPointerException
反而。
这符合 API 设定的指南:
NullPointerException
:应用程序应该抛出此类的实例以指示该类的其他非法使用null
目的。
另外,这里引用一段话 有效的 Java 第二版:第 60 项:赞成使用标准例外:
可以说,所有错误的方法调用都归结为非法参数或非法状态,但其他异常通常用于 某些种类 非法论点和状态。如果呼叫者通过
null
在某些禁止空值的参数中,约定规定:NullPointerException
被扔掉而不是IllegalArgumentException
.
其他提示
一片空白, ,因为该论点仍然为无效。
但是,为什么不简单地在没有消息的情况下抛出NullPoInterException?
我建议说
if (userName == null) {
throw new IllegalArgumentException("username == null");
}
因为这是如此致命,以至于程序员必须看它。在异常消息中引用有问题的代码段是我能想象的简洁的事情。
我倾向于写这篇文章:
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"
.
- 因为抛出异常时,该消息正在报告状态。
- 因为这样做是常规的。