我的系统有这个类:
PersonBean - handles the requests from the view;
PersonService - provides all operations for the PersonBeam;
PersonDao - provides data acess from db to Service classes;
我的findById(int personId)
课程中有PersonDao
方法。当PersonDao
找不到包含所提供的Person
的任何Id
时,它会返回Null
。我应该在哪里处理Null
?在哪一层?
由于
答案 0 :(得分:2)
我想说null应尽可能在堆栈中传回,这样可以在需要时以不同方式处理每个层(并且取决于PersonDao
的路径,如果它不同在代码的其他方面)。在这种情况下,我认为处理null
中的PersonBean
是有意义的。
这是假设你只是在讨论null
引用,而不是NullPointerException
,如果是这种情况,请在最低级别处理它,即{{1} }}
答案 1 :(得分:1)
对此没有“正确”的答案。但是,也许我可以提供一些建议。
不要在存储库级别捕获它,因为返回null
是不存在某些内容时的常见做法。至于处理它的位置,它不应该向用户显示,并且您也不必担心它在应用程序的多个区域是否为空。
所以,选择你可以适当处理它的最低层(因为你有足够的信息来说明你为什么要求它)所以你不必在任何地方处理它。另一种方法是定义服务方法,如:
getIfExists(String id)
可能返回null,而get(String id)
会抛出异常(如果你曾经查询过你知道id应该对应一个用户的东西,如果它确实是错误的话)不是)。
答案 2 :(得分:1)
你需要思考一个人是否是一个例外情况。它是否出现在正常程序流之外的?如果是这样,我会抛出语义上有效的异常,这意味着找不到记录。
Hibernate(例如)有两种检索方法:get
和load
。如果找不到记录,load
将抛出异常,而get
会返回null
。所以你可以使用类似的方法。这使得在合同中隐含一个方法期望找到记录,而另一个方法则没有。
至于处理它的位置,如果你要返回null
,那么我会在最后一层处理它,即在你实际要求的实例{{1 }}。只有在那一层,您才能就如何处理Person
null
实例做出信息性的决定。
如果您认为没有找到记录是一个例外情况,那么我会抛出一个异常(正如我之前提到的,不是Person
,而是一些其他异常,意味着记录未找到)找不到。