【发布时间】:2011-06-03 17:40:52
【问题描述】:
我是否应该检查需要在构造函数中有效的值是否传递了空值?换句话说,我应该让类在它获得无效值时抛出,还是应该让它一直存在,直到它尝试对它做某事,让运行时引发异常?
我想如果传递一个空值是一个错误,我应该在构造函数中这样对待它吗?
【问题讨论】:
-
你应该尽早尝试失败
标签: java
我是否应该检查需要在构造函数中有效的值是否传递了空值?换句话说,我应该让类在它获得无效值时抛出,还是应该让它一直存在,直到它尝试对它做某事,让运行时引发异常?
我想如果传递一个空值是一个错误,我应该在构造函数中这样对待它吗?
【问题讨论】:
标签: java
基本规则: 如果您的构造函数不能保证给定参数的稳定和有效状态,则抛出异常!
因此,如果您需要值为 != null 来获得有效的对象状态,请立即检查并抛出异常。你还要什么时候做?
【讨论】:
我总体上同意 duffymo,但这也取决于您何时需要使用该潜在的空值。如果构造函数中需要它,那么是的,你应该在那里抛出一个 IllegalArgumentException 。但是,如果稍后才需要该值(例如,在另一种方法中),那么您可以(并且可能应该)将 null 检查推迟到该点。
【讨论】:
请参阅this StackOverflow post 和有关 Fail Early 原则的说明。如果传递一个空值是一个错误,你应该在构造函数中这样对待它。
【讨论】:
我愿意。如果合同中包含非空参数,请务必通过 IllegalArgumentException 或断言通知用户。
我选择“最小惊喜”的方式。
【讨论】:
NullPointerException 会更合适。而 assert 主要只是用于调试目的。
如果在传递 null 时无法继续进行而不出现错误,则在构造函数中尽早捕获它。
如果你还能做点什么,那就等着吧。
【讨论】: