空检查错误消息为“为空”或“为空”

时间:2010-06-11 11:31:57

标签: java illegalargumentexception preconditions

在Java代码中执行空检查,并且为空值抛出IllegalArgumentExceptions时,您使用什么类型的消息模板?

我们倾向于使用这样的东西

public User getUser(String username){
   if (username == null){
     throw new IllegalArgumentException("username is null");   
   }
   // ...
}

更好的是:“为空”或“为空”,为什么?

对我而言,“无效”感觉更自然。

4 个答案:

答案 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"

  • 因为消息在报告异常时报告状态。
  • 因为这样做是常规的。