返回null,异常,合同

时间:2018-10-25 08:07:57

标签: java exception-handling null design-by-contract

处理具有以下3种潜在结果的从数据库返回记录的可接受方法:

  1. Db连接有效,找到一个用户并返回一个填充的用户对象
  2. Db连接有效,找不到用户,返回新的用户对象
  3. db连接/查询失败...

我主要是按合同设计:

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();
        }
}

在数据库连接或查询失败的情况下,我应该做的事情不太明显,我有几种选择:

  • 返回新用户对象,因为我们的方法已同意返回用户
    • Pro:这坚持按合同进行设计
    • 缺点:这使得用户似乎不存在。
  • 返回null ,因为它实际上并没有获得用户。
    • 专业人士:完全清楚,找不到用户
    • 缺点:需要进行空检查
  • 引发异常
    • 专业版:明确表明未完成操作
    • 缺点:请不要尝试纠正发生的问题

我倾向于处理异常,因为它避免了十亿美元的错误,并且在正常情况下也按合同维护设计。

但是,我想知道是否存在任何明显的陷阱,或者这是一种熟悉的情况,并且具有建立良好的解决方案。

2 个答案:

答案 0 :(得分:1)

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

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

我的选择是引发异常

答案 1 :(得分:0)

使用可选(请)。这明确表明在数据库中找不到该用户,并避免使用NullPointerException。

  • 可选(用户),如果在数据库中找到了用户
  • 如果找不到用户,则为空
  • 如果出现错误,则有两个选择:
    • 通知客户端,以便它可以获取反馈并对此失败做出反应。在这种情况下,抛出异常并在适当的层中对其进行处理。对于大多数应用程序,这应该是默认行为。
    • 将其隐藏到客户端,这种情况不太常见,但有时客户端不在乎,或者您不想发布失败。在这种情况下,只需返回一个空值即可。