处理 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(例如)有两种检索方法:get
和 load
。 load
会在找不到记录时抛出异常,而 get
returns null
。所以你可以使用类似的方法。这使得合同中隐含了一种方法期望找到记录,而另一种方法则没有。
至于在哪里处理,如果你要返回null
,那么我会在最远的层处理它,即在你实际请求实例的层Person
。只有在该层,您才能做出有关如何处理 null
Person
实例的信息决定。
如果你认为找不到记录是一个例外情况,那么我会抛出一个异常(正如我之前提到的,不是 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(例如)有两种检索方法:get
和 load
。 load
会在找不到记录时抛出异常,而 get
returns null
。所以你可以使用类似的方法。这使得合同中隐含了一种方法期望找到记录,而另一种方法则没有。
至于在哪里处理,如果你要返回null
,那么我会在最远的层处理它,即在你实际请求实例的层Person
。只有在该层,您才能做出有关如何处理 null
Person
实例的信息决定。
如果你认为找不到记录是一个例外情况,那么我会抛出一个异常(正如我之前提到的,不是 NullPointerException
,而是其他一些暗示找不到记录的异常)找不到记录。