处理 NullPointerException 的最佳层是什么?

What is the best layer to handle a NullPointerException?

我的系统有这些 classes:

PersonBean - handles the requests from the view;
PersonService - provides all operations for the PersonBeam;
PersonDao - provides data access from db to Service classes;

我的 PersonDao class 上有一个 findById(int personId) 方法。当 PersonDao 无法通过提供的 Id 找到任何 Person 时,它 returns Null。我应该在哪里处理 Null?在哪一层?

我会说 null 应该在堆栈中尽可能远地传回,以便在需要时可以在每一层进行不同的处理(并且取决于 PersonDao 的路径,如果它在代码的其他区域有所不同)。在这种情况下,我认为在 PersonBean.

中处理 null 是有意义的

这一切都假设您只是在谈论 null 参考,而不是 NullPointerException,如果是这种情况,请在最低级别处理它,即 PersonDao.

没有 "correct" 答案。不过,也许我可以提供一些建议。

不要在存储库级别捕获它,因为 returning null 是当某些东西不存在时的常见做法。至于在哪里处理它,它不应该出现在用户面前,你也不想担心它在应用程序的多个区域是否可能为空。

因此,选择您可以适当处理它的最低层(因为您有足够的信息说明您请求它的原因),这样您就不必在任何地方都处理它。另一种方法是定义服务方法,例如:

getIfExists(String id) 可能 return 为 null,而 get(String id) 如果为 null 则将抛出异常(如果您曾经查询过您知道 ID 应该对应于用户的位置并且如果没有,则有问题。

你要想想找不到人是不是特例。它是否发生在正常程序流程之外?如果是这样,我将抛出语义上有效的异常,暗示未找到该记录。

Hibernate(例如)有两种检索方法:getloadload 会在找不到记录时抛出异常,而 get returns null。所以你可以使用类似的方法。这使得合同中隐含了一种方法期望找到记录,而另一种方法则没有。

至于在哪里处理,如果你要返回null,那么我会在最远的层处理它,即在你实际请求实例的层Person。只有在该层,您才能做出有关如何处理 null Person 实例的信息决定。

如果你认为找不到记录是一个例外情况,那么我会抛出一个异常(正如我之前提到的,不是 NullPointerException,而是其他一些暗示找不到记录的异常)找不到记录。