您是否知道Apache Commons Validate或Guava Preconditions的一些不错的替代方法,在检查对象是否不为空(Spring Assert除外)时会抛出 IllegalArgumentException 而不是 NullPointerException ?
我知道Javadocs说:
应用程序应抛出此类 [NullPointerException] 的实例,以指示空对象的其他非法用途。
尽管如此,我只是不喜欢它。对我来说,NPE 总是意味着我只是忘记在某处保护空引用。我的眼睛受过如此训练,我可以发现它以每秒几页的速度浏览日志,如果我这样做了,我的脑海中总是会启用错误警报。因此,将它扔到我期望 IllegalArgumentException 的地方会让我很困惑。
假设我有一个 bean:
public class Person {
private String name;
private String phone;
//....
}
和服务方法:
public void call(Person person) {
//assert person.getPhone() != null
//....
}
在某些情况下,一个人没有电话可能没问题(我奶奶没有任何电话)。但是如果你想打电话给这样的人,对我来说,它是调用带有IllegalArgument传递的call方法。查看层次结构 - NullPointerException 甚至不是 IllegalArgumentException 的子类。它基本上告诉您-您再次尝试在 null 引用上调用 getter。
此外,已经进行了讨论,我完全支持这个很好的答案。所以我的问题是——我需要做这样丑陋的事情吗:
Validate.isTrue(person.getPhone() != null, "Can't call a person that hasn't got a phone");
以我的方式进行,或者是否有一个库会抛出 IllegalArgumentException 进行 notNull 检查?