我正在练习java应用程序,我有一个关于DAO对象和JDBC的问题。
当我的web应用程序无法加载MySQL驱动程序类时,我想按照‘快速失败’策略终止web应用程序。因此,ClassNotFoundException of Class.forName(DB_DRIVER);不应该被try-catch抓住。
(添加更多解释)
但是,在没有try-catch的情况下,代码有一个逻辑错误。在带Unhandled exception type ClassNotFoundException的eclipse中有红色下划线。我不知道如何实现‘快速失败’。
我的问题是..。
Class.forName(DB_DRIVER);,哪个类,哪个方法,.等?(我不想执行每个数据请求)时如何终止它?
我使用,这是我的代码。
TodoDao.java
public class TodoDao {
private static final String GET_TODOS = "SELECT id, title, name, regDate, sequence, type"
+ " FROM todo"
+ " ORDER BY regdate DESC;";
public TodoDao() {
DBConnection.updateDriver(); // fast-fail
}
public List<TodoDto> getTodos() {
// ...skip
}
}DBConnection.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection {
private static final String DB_DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String DB_URL = "jdbc:mysql://localhost/boostcourse"
+ "?useSSL=false&serverTimezone=UTC&characterEncoding=utf8";
private static final String DB_USER = "testuser";
private static final String DB_PASSWD = "test1234!";
public static final void updateDriver() throws ClassNotFoundException {
Class.forName(DB_DRIVER);
}
public static final Connection getConnection() throws SQLException {
return (Connection) DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWD);
}
}MainServlet.java(呼叫道)
// ...skip
@WebServlet(UriInfo.MAIN)
public class MainServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public MainServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
TodoDao dao = new TodoDao();
List<TodoDto> todos = dao.getTodos();
request.setAttribute("todos", todos);
RequestDispatcher requestDispatcher = request.getRequestDispatcher("WEB-INF/main.jsp");
requestDispatcher.forward(request, response);
}
}发布于 2020-06-27 13:52:21
有两种方法:
public TodoDao() throws ClassNotFoundException {
DBConnection.updateDriver(); // fast-fail
}这种方法只是推迟了问题的发生。现在,TodoDao的调用者必须处理它。
public TodoDao() {
try {
DBConnection.updateDriver(); // fast-fail
} catch (ClassNotFoundException ex) {
throw new RuntimeException("Cannot load JDBC driver class", ex);
}
}这种方法将异常重新抛出为未经检查的异常,这样调用方就不必处理它。您可以(而且可能应该)声明和使用自定义的未经检查的异常,而不是抛出RuntimeException。
然而,在我看来,TodoDao的唯一目的似乎是强制加载数据库驱动程序。所以你为什么不按照第一个解决方案来声明.处理来电者的异常..。这大概是在一个您可以处理配置错误的地方;例如,放弃servlet初始化。
https://stackoverflow.com/questions/62610738
复制相似问题