【问题标题】:What is the best layer to handle a NullPointerException?处理 NullPointerException 的最佳层是什么?
【发布时间】:2015-01-21 16:21:51
【问题描述】:

我的系统有这些类:

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(int personId) 方法。当PersonDao 无法使用提供的Id 找到任何Person 时,它会返回Null。我应该在哪里处理Null?在哪一层?

【问题讨论】:

  • 我会处理来自数据层(即实体)和向上(访问层、服务层等)的 NPE。你必须记住,NPE 可以被扔到不同的层,如下所述@mnd

标签: java dao


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      getIfExists(String id) 可能返回 null,get(String id) 如果为 null,则将引发异常(如果您曾经查询您知道 id 应该对应于用户的位置,如果不对应则出现问题)。

      【讨论】:

        猜你喜欢
        • 2011-06-05
        • 1970-01-01
        • 2010-09-06
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 2012-09-18
        • 2011-05-20
        • 2016-05-26
        相关资源
        最近更新 更多