Java最后在使用RequestDispatcher时不调用

时间:2015-02-18 19:47:15

标签: java servlets try-catch-finally

我们有一个Java servlet充当Web应用程序的调度程序。对于每个请求,创建数据库连接,然后在请求结束时提交/回滚,具体取决于操作是否成功。它看起来像:

public class WebDispatcher extends HttpServlet {

    protected void processRequest(HttpServletRequest request,
                                  HttpServletResponse response)
                                  throws ServletException, IOException {

        Connection conn = null;

        try {

           // Create connection

        } catch(.....) { 

        } finally {

          // Commit / Rollback connection

        }

    }

}

出现异常时会出现问题。例如,如果他们无法访问某个操作,则调度员必须重定向它们。它通过使用请求调度程序来完成此任务。

} catch(RoleAuthorizationException rae) {

    request.getRequestDispatcher(.....).forward(request, response);

}

我原以为'最后'会被召唤,但在这种情况下似乎并没有。每次例外,我们最终都会丢失池中的连接。作为一种解决方法,我们正在关闭每个例外的连接,但为什么最终没有被调用?

1 个答案:

答案 0 :(得分:1)

最后is always called(oracle docs):

  

当try块退出时,finally块始终执行。

检查finally块中是否抛出异常(在连接关闭之前)。

另见this answer