我在Stackoverflow上多次看到这段代码:
public void doStuff(Object anObject) {
if (anObject == null) {
throw new NullPointerException("anObject can't be null");
}
//rest of the function
}
这是针对null
参数的保护子句,因为将null
传递给需要参数为非null的函数将导致NullPointerException
。
我理解保护条件在其他情况下验证参数的重要性(即检查日期范围,负货币值,无效字符串大小等)。
但是,如果null
具体,则不会使NullPointerException
多余?这与让运行时稍后抛出NullPointerException
本身有何不同?
注意:我用语言无关的方式询问,因为模式本身可以应用于Java和C#。
答案 0 :(得分:7)
由于这个问题有C#标签,我将回答有关C#的案例。在这种情况下,访问空指针时抛出的是NullReferenceException
,并且当参数为null时通常抛出的是ArgumentNullException
。但更重要的是,当你明确地检查参数时,你:
NullReferenceException
抛出的时候,你会猜测究竟是什么,以及在哪里。答案 1 :(得分:4)
唯一的区别是它何时发生。在代码开始修改状态之前,有时可能需要提前抛出异常,如果在中间抛出异常,则可能无效。 那就是说,抛出一个编辑:根据下面的评论,NullPointerException
似乎是不好的做法;抛出IllegalArgumentException
会更好。NullPointerException
是推荐的例外情况,至少在Java中是这样。
答案 2 :(得分:1)
这有助于尽快检测错误。该方法可能不会抛出空指针异常(取决于代码的逻辑),并且null对象可能在其他方法/代码中的其他地方传播并在那里抛出异常,或者更糟糕的是它可能导致错误的结果,从而导致一个无声的bug可能会把它变成最终的代码......
从Effective Java Second Edition中提取
如果将无效参数值传递给方法和方法 在执行之前检查其参数,它将很快失败 干净利落地适当例外。如果方法无法检查 它的参数,可能会发生几件事。该方法可能会失败 在处理过程中有一个令人困惑的例外。更糟糕的是 方法可以正常返回但是默默地计算错误的结果。 最糟糕的是,该方法可以正常返回,但留下一些对象 在一个受损的状态下,在某个不相关的点导致错误 未来某个未定时间的代码。