在解除引用之前检查null,或者只是通过异常捕获空引用

时间:2011-07-08 17:20:59

标签: exception exception-handling null

在引用之前检查null,或者只是通过异常捕获空引用?赞成还是缺点?

对于第二个选项,它提供了干净且有时更好的代码。对于第一个选项,它可以为您提供您想要的不间断流程

3 个答案:

答案 0 :(得分:2)

我说这完全取决于情况。如果仅仅是:例外,则抛出异常并没有错。

另一方面,如果您希望某个null值出现在给定点(没有潜在的错误),那么在使用/引用之前,您应该检查null对象

但是,我再也不认为这里存在绝对的对错 - 这取决于具体情况。


文章C++ Exceptions: Pros and Cons进一步说明了例外的利弊。它适用于C ++,但我认为逻辑也可以转移到许多其他类型的编程语言中。他们的结论始于: ""例外或错误代码没有简单的答案"题。需要根据开发团队面临的具体情况做出决策。一些粗略的指导方针可能是:......"

答案 1 :(得分:1)

检查是否为空。取决于系统的异常处理系统是草率的,异常可能有资源分配需求,可能导致问题(很少见,但可能)。

答案 2 :(得分:1)

在系统边界检查null并正确处理它。在你的软件中,你知道什么时候应该能够为null,这意味着什么,所以没有理由进行不必要的检查或捕获永远不会抛出的异常。测试代码与其他组件接口的位置,以确保它处理,例如,第三方代码返回的空值或公共API的调用者传入的空值。

IMO,您几乎不必抓住NullPointerException / NullReferenceException(或您的语言称之为)。如果第三方库返回null,处理它的最佳方法通常是抛出您自己的异常,并带有明确的消息,您可以稍后记录或冒泡到用户,例如:

if(returnedValue == null)
{
    throw new MyDescriptivelyNamedException("libcrappy returned null again!");
}

如果组件的使用者传入null参数,则抛出ArugmentNullExceptionIllegalArgumentException或任何适合您的语言/应用程序的内容。