先决条件库抛出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
Preconditions
的checkArgument
呢?
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));
链接:
注意:这个库也支持前置条件和后置条件(比如真正的断言),并且如果需要,可以注册自己定制的全局策略:
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?