先决条件库抛出IllegalArgumentException为notNull检查

你知道一些很好的替代Apache Commons Validate或Guava Preconditions,当检查对象是否为空(Spring Assert除外)时,会抛出IllegalArgumentException而不是NullPointerException?


我知道Javadocs说:

应用程序应该抛出此类的实例[NullPointerException]来指示其他非法使用null对象。

不过,我只是不喜欢它。 对我而言,NPE总是意味着我忘记了在某处放置空引用。 我的眼睛是如此训练有素,我可以发现它以每秒几页的速度浏览日志,如果我这样做,我的头脑中总是有bug警报。 因此,如果将它抛出到我期望出现IllegalArgumentException的地方,将会非常困惑。

说我有一个豆:

public class Person {
  private String name;
  private String phone;
  //....
}

和一个服务方法:

public void call(Person person) {
  //assert person.getPhone() != null
  //....
}

在某些情况下,可能没有问题,一个人没有电话(我的祖母不拥有任何电话)。 但是,如果你想打电话这样的人,对我来说它调用与传递的IllegalArgument调用方法。 查看层次结构 - NullPointerException甚至不是IllegalArgumentException的子类。 它基本上告诉你 - 再次尝试在空引用上调用getter。

此外,已经有了讨论,我完全支持这个很好的答案。 所以我的问题只是 - 我需要做这样的丑陋的事情:

Validate.isTrue(person.getPhone() != null, "Can't call a person that hasn't got a phone");

以我的方式,还是有一个图书馆,只会抛出IllegalArgumentException异常检查?


由于这个问题的主题演变为“正确使用IllegalArgumentException和NullpointerException” ,我想指出Effective Java Item 60(第二版)中的海峡前瞻性答案:

可以说,所有错误的方法调用归结为非法论证或非法状态,但其他例外标准用于某些类型的非法论证和状态。 如果调用者在某些禁止使用空值的参数中传递null,那么约定规定抛出NullPointerException而不是IllegalArgumentException 。 同样,如果调用方将表示索引的参数的超范围值传递到序列中,则应抛出IndexOutOfBoundsException而不是IllegalArgumentException。


checkArgument PreconditionscheckArgument呢?

public void call(Person person) {
    Preconditions.checkArgument(person.getPhone() != null);
    // cally things...
}

checkArgument throws IllegalArgumentException而不是NullPointerException


你可以用ham_rest-matchers使用valid4j(在Maven中心找到org.valid4j:valid4j)。 “验证”类支持定期输入验证(即抛出可恢复的异常):

import static org.valid4j.Validation.*;

validate(argument, isValid(), otherwiseThrowing(InvalidException.class));

链接:

  • http://www.valid4j.org/
  • https://github.com/valid4j/valid4j
  • 注意:这个库也支持前置条件和后置条件(比如真正的断言),并且如果需要,可以注册自己定制的全局策略:

    import static org.valid4j.Assertive.*;
    
    require(x, greaterThan(0)); // throws RequireViolation extends AssertionError
    ...
    ensure(r, notNullValue()); // throws EnsureViolation extends AssertionError
    
    链接地址: http://www.djcxy.com/p/13313.html

    上一篇: Preconditions library to throw IllegalArgumentException for notNull check

    下一篇: Is it a bad idea if equals(null) throws NullPointerException instead?