java - EmptyResultDataAccessException 作为运行时异常

标签 java spring exception spring-jdbc

这在我脑海中持续了很长时间,我仍然想知道为什么 spring jdbc 将 EmptyResultDataAccessException 作为运行时异常,而不是强制调用方法(通过生成异常)来捕获 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 的列表对象。因此,这里 spring jdbc 不会抛出 EmptyResultDataAccessException ,而是在没有从 DB 获取记录的情况下创建新的 List 对象。

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

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 创建了我们没有处理它的新对象。

发布此内容是为了让自己清楚这方面的情况。谢谢

最佳答案

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

这可以追溯到运行时异常与检查异常的使用,本网站和其他地方有大量引用资料。

关于java - EmptyResultDataAccessException 作为运行时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22831322/

相关文章:

java - 模拟静态方法

java - 如何从 Jython 加载 springframework ApplicationContext

java - Spring 中是否有 ServiceLoader 的类似物以及如何使用它?

java - Hibernate 事务回滚是否有效?

C# System.InvalidCastException

python - 如何返回值并引发异常

java - "java.lang.OutOfMemoryError"错误是否会导致任何安全问题?

java - 无法在 Eclipse 中从 Nvidia Tegra Developer Pack 导入 o​​rg.opencv[...]

java - 使用输入 Excel 中的更新更新 Jar 文件

java - 当我捕获异常并记录它时,日志仅显示异常名称,而不是异常堆栈