Java 处理NullPointerException的最佳层是什么?

Java 处理NullPointerException的最佳层是什么?,java,dao,Java,Dao,我的系统有以下几个类: PersonBean - handles the requests from the view; PersonService - provides all operations for the PersonBeam; PersonDao - provides data access from db to Service classes; 我在我的PersonDao类上有一个findById(intpersonid)方法。当PersonDao找不到任何具有提供的Id的Pe

我的系统有以下几个类:

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

我在我的
PersonDao
类上有一个
findById(intpersonid)
方法。当
PersonDao
找不到任何具有提供的
Id
Person
时,它返回
Null
。我应该在哪里处理
Null
?在哪一层?

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


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

,我想说null应该在堆栈中尽可能地传递回去,因此,如果需要,可以在每一层对其进行不同的处理(并且取决于
PersonDao
的路径,如果它在代码的其他区域不同)。在这种情况下,我认为在
PersonBean
中处理
null
是有意义的

这都是假设您只谈论
null
引用,而不是
NullPointerException
,如果是这种情况,请在最低级别处理它,这将是
PersonDao

对此没有“正确”的答案。不过,也许我可以提供一些建议

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

所以,选择一个最底层,你可以在其中适当地处理它(因为你有足够的信息说明你为什么要请求它),这样你就不必到处处理它了。另一种方法是定义服务方法,如:

getIfExists(String id)
可能返回null,而
get(String id)
如果为null,则会抛出异常(如果您查询的是您知道id应该与用户对应的位置,如果不对应则会出错)。

对此没有“正确”的答案。不过,也许我可以提供一些建议

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

所以,选择一个最底层,你可以在其中适当地处理它(因为你有足够的信息说明你为什么要请求它),这样你就不必到处处理它了。另一种方法是定义服务方法,如:


getIfExists(String id)
可能返回null,而
get(String id)
如果为null,则会抛出异常(如果您查询的是您知道id应该与用户对应的位置,如果不对应则会出错)。

您需要考虑是否找不到人是一个例外情况。这是发生在正常程序流程之外的事情吗?如果是这样,我将抛出语义有效的异常,这意味着找不到记录

例如,Hibernate有两种检索方法:
get
load
<当找不到记录时,code>load将抛出异常,而
get
返回
null
。所以你可以使用类似的方法。这使得契约中隐含着一种方法期望找到记录,而另一种方法不期望

至于在哪里处理它,如果您返回
null
,那么我将在后面最远的层处理它,即在您实际请求
人员的实例的层。只有在该层中,您才能做出关于如何处理
null
Person
实例的信息决策


如果您认为找不到记录是一个例外情况,那么当找不到记录时,我会抛出一个例外情况(正如我前面提到的,不是
NullPointerException
,而是其他一些表示找不到记录的例外情况)。

您需要考虑找不到人是否是一个例外情况。这是发生在正常程序流程之外的事情吗?如果是这样,我将抛出语义有效的异常,这意味着找不到记录

例如,Hibernate有两种检索方法:
get
load
<当找不到记录时,code>load
将抛出异常,而
get
返回
null
。所以你可以使用类似的方法。这使得契约中隐含着一种方法期望找到记录,而另一种方法不期望

至于在哪里处理它,如果您返回
null
,那么我将在后面最远的层处理它,即在您实际请求
人员的实例的层。只有在该层中,您才能做出关于如何处理
null
Person
实例的信息决策


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

我会从数据层(即实体)及以上处理NPE(访问层、服务层等)。您必须记住,NPE可以被抛出到不同的层,如下所述,@mndI将从数据层处理NPE(即