8

可能重复:
为什么要实现 finalize()?

我看到了一些带有以下代码的java文件:

public void finalize() {
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e) {
        }
    }
}
  • 关闭方法Connection中的finalize最佳实践吗?
  • 是否足以关闭Connection或是否还需要关闭其他对象,例如PreparedStatement
4

4 回答 4

9

从 Java 7 开始,关闭资源的最佳实践是使用 try-with-resource :

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

于 2012-05-13T20:32:44.347 回答
5

不,那不是“最佳实践”,甚至不是“可以通过的实践”。您无法保证何时调用终结器,因此它不起作用。

相反,您应该将资源范围限定为一个块,如下所示:

try {
  acquire resource
}
finally {
  if (resource was acquired)
    release it
}
于 2012-05-13T20:32:05.813 回答
2

不,如果有的话,不太可能及时调用终结器。明确且肯定地清理您的资源。

/* Acquire resource. */
try {
  /* Use resource. */
}
finally {
  /* Release resource. */
}
于 2012-05-13T20:39:32.980 回答
-2

获得 Connection 对象后,使用它来执行 PreparedStatement/Statement/CallableStatement,这些语句放在 try 块中,然后执行诸如关闭 statment 和 conn 之类的清扫工作。

例如:

 try{

    Connection conn = DriverManager.getConnection(url,username,password);

    PreparedStatement pStat = conn.prepareStatement("Drop table info");

    pStat.executeUpdate();
      }
       catch(Exception ex){
        }

   finally(){

     pStat.close();
     conn.close();
 }
于 2012-05-13T20:40:03.223 回答