今天我遇到了以下情况:(“伪代码”)
class MyClass {
public void workOnArray(Object[] data) {
for (Object item : data) {
workOnItem(item);
}
}
public void workOnItem(Object item) {
if (item == null) throw new NullPointerException();
}
}
现在,如果来电者使用包含workOnArray
项的数组调用null
,则调用者会因NullPointerException
而获得workOnItem
。
但我可以在workOnArray
中插入附加检查,换句话说,可以更快地检测到问题。
(请注意,这是一个简单的例子,在现实生活中,这可能不太明显)。
在专业方面,我会说额外的检查可以提供更多高级诊断信息。早期失败总是一件好事。
另一方面,我会问自己“如果我这样做,我是否也应该验证传递给我的编程语言的核心API的每个参数并抛出完全相同的异常?”
在提早抛出异常以及何时让被调用者抛出异常时,是否有一些经验法则?
答案 0 :(得分:8)
在循环处理这样的项目的情况下,有一件事肯定会让我想先预先验证整个项目数组;如果在抛出异常之前处理某些项目是不好的,则不处理任何剩余的项目。
除非包含代码的某种事务机制,我通常希望在开始处理代码之前确保集合中的项目有效。
答案 1 :(得分:2)
在此示例中,workOnItem方法是关注item是否为null的方法。 workOnArray方法不关心项目是否为空,因此IMO不应验证任何项目是否为空。 workOnItem方法非常小心,因此应该执行检查。
我还会考虑从workOnItem中抛出一个更合适的异常类型。 NullPointerException(或在C#中,NullReferenceException)通常表示方法操作中存在一些意外缺陷。在C#中,我更倾向于抛出包含null参数名称的ArgumentNullException。这更清楚地表明workOnItem无法继续,因为它无法处理接收null参数。