EmptyResultDataAccessException作为运行时异常

时间:2014-04-03 08:00:47

标签: java spring exception spring-jdbc

这在我脑海中已经很久了,我仍然想知道为什么spring jdbc将EmptyResultDataAccessException作为运行时异常而不是强制调用方法(通过制作Exception)来捕获EmptyResultDataAccessException,我亲自面临一个问题,当我第一次实现spring jdbc,让我们来看看第一个场景

public List<User> getUsers(String firstName){
JdbcTemplate jd = this.getJdbcTemplate();

        List<User> userLst =  jd.query("select query for user here matched firstname", BeanPropertyRowmapper(User.class))
}

在上面的场景中,即使这个select查询没有返回任何值,spring jdbc仍然会创建一个类型为user的新List对象,并返回大小为0的list对象。所以这里spring jdbc不会抛出EmptyResultDataAccessException,而是创建新的List对象,如果没有从DB获取rec。

其次,如果查询对象,它的行为会有所不同。

User user = jd.queryForObject("select * from user where user_id = [EDITuser id here", User.class)

这里spring jdbc抛出EmptyResultDataAccessException,因为它没有找到 * user_id = 1 * 的任何记录。

更重要的是,由于EmptyResultDataAccessException是运行时异常,我没有被强制捕获此异常并对此异常执行某些操作,因此大多数时候开发人员都感到困惑并且没有被注意到。

正如我在第一个场景中所说,当我第一次编码时,我期待userLst对象为null,但实际上spring jdbc创建了我们没有处理它的新对象。

张贴此内容以便在这方面做出明确表示。感谢

1 个答案:

答案 0 :(得分:1)

很可能没有办法让每个人都开心。相反,你完全知道该行存在,因为它是一个有效的ID。然而,调用此方法会强制您捕获永远不会抛出的异常,因此您有一个空的catch块,这很糟糕。

这可以追溯到运行时异常与已检查异常的使用,此站点和其他地方有很多引用。