下面的代码段摘自Spring 5 Recipes一书(第386页)。我正在尝试运行和测试代码,但为NullPointerException
变量获取了sqle
,而且似乎在春季5中SQLException
和DataAccessException
之间没有任何关系。有人可以告诉我吗为什么和如何?
package com.apress.springrecipes.vehicle;
...
import java.sql.SQLException;
import org.springframework.dao.DataAccessException;
public class Main {
public static void main(String[] args) {
...
VehicleDao vehicleDao = context.getBean(VehicleDao.class);
Vehicle vehicle = new Vehicle("EX0001", "Green", 4, 4);
try {
vehicleDao.insert(vehicle);
} catch (DataAccessException e) {
SQLException sqle = (SQLException) e.getCause();
System.out.println("Error code: " + sqle.getErrorCode());
System.out.println("SQL state: " + sqle.getSQLState());
}
}
}
答案 0 :(得分:1)
首先,您永远不会检查e.getCause()是否返回null。 如果返回null,则您的代码容易受到NullPointerException的攻击
第二点是,为什么Spring改变其处理数据库/ jpa异常的方式。 已经有一些关于此的对话。例如LINK
或者,您还可以阅读C. Walls撰写的书“ Spring in Action” ,在其中我们可以阅读有关JDBC的章节。
(10.1.1了解Spring的数据访问异常层次结构)
一方面,JDBC的异常层次结构太笼统了-不多 一个层次结构。另一方面,Hibernate的例外 层次结构是Hibernate专有的。我们需要的是一个层次结构 描述性但非直接的数据访问异常 与特定的持久性框架相关联。
我强烈建议您完整阅读本章以了解该主题。