0

我有一个 jdbcpostgresql应用程序,我编写了“标准”连接管理器。对于每个成功的事务,我都会关闭语句对象和连接对象。如果其中一个SQLExceptionClassNotFoundException发生,语句和连接对象会发生什么?在 catch 块中我应该关闭这两个对象吗?就像是:

Connection conn = null;
PreparedStatement pstm = null;
try {
    conn = ConnectionManager.getConnection();
    pstm = conn.CreateStatement(statement);
    //set statement
    }catch (SqlException ex) {
        if(conn != null) {
            pstm.close();
            conn.close();
        }
        throw new MyException("error");
    }catch (ClassNotFoundException ex) {
        if(conn != null) {
            pstm.close();
            conn.close();
        }
        throw new MyException("error");
     }
}
4

3 回答 3

4

在 catch 块中我应该关闭这两个对象吗?

没有。切勿关闭 catch 块中的任何对象。关闭任何资源使用finally{}块。

于 2013-06-30T16:25:23.457 回答
2

您可以将连接和语句关闭语句放在finally块中,以确保无论是否有异常都已关闭。finally 总是在 try 块退出时被执行。你可以尝试这样的事情:

Connection conn = null;
PreparedStatement pstm = null;
try {
    conn = ConnectionManager.getConnection();
    pstm = conn.CreateStatement(statement);
    //set statement
    }catch (SqlException ex) {
        throw new MyException("error");
    }catch (ClassNotFoundException ex) {
   
        throw new MyException("error");
     }finally {
        if(conn != null) {
         try {
            pstm.close();
            conn.close();
         } catch (SQLException e) {  
           // throw or log the exception;
         }

        }
    }
}
于 2013-06-30T16:25:15.810 回答
2

在你的代码资源被尝试在几个地方关闭,导致代码重复。

所以你应该使用finallyblock 来关闭资源,如下所示:

 finally {
    if (pstm != null) {
        try {
           pstm.close();
        } catch (SQLException e) { /* ignored */}
    }

    if (conn != null) {
       try {
          conn.close();
       } catch (SQLException e) { /* ignored */}
    }
 }

因为无论发生什么事情,finallyblock 都会在方法调用返回之前执行。

于 2013-06-30T16:27:52.453 回答