代码之家  ›  专栏  ›  技术社区  ›  Royal Wares

返回Null vs Exception vs Contract

  •  0
  • Royal Wares  · 技术社区  · 6 年前

    1. Db连接工作,找到一个用户并返回一个填充的用户对象
    2. 数据库连接工作,找不到用户,返回一个新的用户对象
    3. 数据库连接/查询失败。。。

    class Scratch {
            public User getUser(int id) {
                try {
                    // Prepare SQL Query
                    PreparedStatement s = this.connection.prepareStatement(
                            "select * from get_user(?)"
                    );
    
                    // Provide SQL Parameters
                    s.setInt(1, id);
    
                    // Run our SQL
                    ResultSet rs = s.executeQuery();
                    rs.next();
    
                    // Extract data into Entity
                    User user = User.createFromDatabase(rs);
                    rs.close();
    
                    return user;
    
                } catch(Exception e) {
                    e.printStackTrace();
                }
    
                return new User();
            }
    }
    

    在DB连接或查询失败的情况下,我应该怎么做就不那么明显了,我有几个选择:

    • 返回新的用户对象
      • 赞成:坚持按合同设计
    • 返回null 因为它实际上没有用户。
      • Pro:很明显没有找到用户
      • Con:需要空检查
    • 引发异常 再往上一点。
      • 缺点:不试图纠正发生问题的地方

    2 回复  |  直到 6 年前
        1
  •  1
  •   Ivar    6 年前

    我会抛出一个异常并让用户知道连接失败。返回NULL是我永远不会做的事情,因为你不知道问题出在哪里。

    我不知道为什么你会返回“新用户对象”如果你没有连接到数据库。您将无法保存用户。

    我的选择是抛出一个例外

        2
  •  0
  •   RoberMP    6 年前

    使用可选的(请)。这将显式说明在数据库中找不到用户,并避免NullPointerException。

    • 如果在数据库中找到用户,则为可选(User)
    • 如果找不到用户,则为空
    • 如果出现错误,您有两种选择:
      • 通知客户机以便获得反馈并对此故障作出反应。在这种情况下,抛出一个异常并在适当的层中处理它。这应该是大多数应用程序的默认行为。