什么是处理NullPointerException的最佳层?

时间:2015-01-21 16:21:51

标签: java dao

我的系统有这个类:

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?在哪一层?

由于

3 个答案:

答案 0 :(得分:2)

我想说null应尽可能在堆栈中传回,这样可以在需要时以不同方式处理每个层(并且取决于PersonDao的路径,如果它不同在代码的其他方面)。在这种情况下,我认为处理null中的PersonBean是有意义的。

这是假设你只是在讨论null引用,而不是NullPointerException,如果是这种情况,请在最低级别处理它,即{{1} }}

答案 1 :(得分:1)

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

不要在存储库级别捕获它,因为返回null是不存在某些内容时的常见做法。至于处理它的位置,它不应该向用户显示,并且您也不必担心它在应用程序的多个区域是否为空。

所以,选择你可以适当处理它的最低层(因为你有足够的信息来说明你为什么要求它)所以你不必在任何地方处理它。另一种方法是定义服务方法,如:

getIfExists(String id)可能返回null,而get(String id)会抛出异常(如果你曾经查询过你知道id应该对应一个用户的东西,如果它确实是错误的话)不是)。

答案 2 :(得分:1)

你需要思考一个人是否是一个例外情况。它是否出现在正常程序流之外的?如果是这样,我会抛出语义上有效的异常,这意味着找不到记录。

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

至于处理它的位置,如果你要返回null,那么我会在最后一层处理它,即在你实际要求的实例{{1 }}。只有在那一层,您才能就如何处理Person null实例做出信息性的决定。

如果您认为没有找到记录是一个例外情况,那么我会抛出一个异常(正如我之前提到的,不是Person,而是一些其他异常,意味着记录未找到)找不到。