最近,我在JDBC主题中遇到了引发异常的问题。

我使用2个同步方法同步了Connection对象:getConnection()和releaseConnection()。然后是另一种从数据库中删除行的方法,如下所示:

public void removeItem(int itemID) throws ItemNotFound {
    PreparedStatement ps = null;
    String query = "DELETE * FROM Student.Book WHERE id = ?";
    getConnection();
    try {
      ps = con.prepareStatement(query);
      ps.setInt(1, bookID);
      ps.executeUpdate();
    } catch (SQLException sqle) {
      this.close(null, null, ps);  // method to close PreparedStatement and ResultSet
      releaseConnection();
      throw new BookNotFoundException("Book not found!");
    } finally {
      this.close(null, null, ps);
      releaseConnection();
    }
}


如果没有异常,一切都会很好。如果发生异常,则在releaseConnection()方法之后的catch块中,抛出新的BookNotFoundException(“找不到书!”)挂断!如果我评论releaseConnection()方法,那么它会正常抛出吗?

最佳答案

您要释放连接两次。即使运行finally块,catch块也将始终运行。我的猜测是先执行throw,然后运行finally块,该块试图再次释放连接。我不确定您是如何实现releaseConnection()的,但是如果在释放连接时阻止了该操作,则可以解释问题。

我认为,如果只是从catch块中删除closereleaseConnection,它应该可以正常工作。

10-04 11:40