上周,我们就在应用程序的服务层中处理null产生了激烈的争论。问题是在.NET上下文中,但在Java和许多其他技术中将是相同的。
问题是:无论什么情况,您是否应该始终检查null并使代码正常工作,还是当意外收到null时让异常冒出?
在我看来,一方面,在您不期望它的地方检查空值(即,没有用户界面来处理它)与编写带有空catch的try块相同。您只是隐藏一个错误。错误可能是代码中的某些内容已更改,并且null现在是预期值,或者存在其他错误,并且将错误的ID传递给该方法。
另一方面,检查空值通常是一个好习惯。此外,如果进行检查,则应用程序可能会继续运行,而只有一小部分功能无效。然后,客户可能会报告一个小错误(例如“无法删除评论”),而不是更严重的错误(例如“无法打开页面X”)。
您遵循哪种做法,您对这两种方法的论点是什么?
更新:
我想添加一些有关我们特殊情况的细节。我们正在从数据库中检索一些对象,并对它们进行了一些处理(比如,建立一个集合)。编写代码的开发人员并不预期该对象可以为null,因此他不包含任何检查,并且在加载页面时出现错误,并且整个页面都没有加载。
显然,在这种情况下,应该进行检查。然后,我们讨论了是否应该检查每个处理的对象(即使不会丢失),以及是否应该静默中止最终的处理。
假设的好处是该页面将继续工作。考虑一下Stack Exchange上不同组(用户,评论,问题)的搜索结果。该方法可以检查是否为空,并中止用户的处理(由于错误为空),但返回“评论”和“问题”部分。该页面将继续工作,只是缺少“用户”部分(这是一个错误)。我们应该尽早失败并中断整个页面,还是继续工作并等待有人注意到“用户”部分丢失了?
assert(foo != null, "foo is web control within the repeater, there's no reason to expect it to be null, etc, etc...");