8

重複の可能性:
なぜfinalize()を実装するのですか?

私は次のコードでいくつかのJavaファイルを見ました:

public void finalize() {
    if (conn != null) {
        try {
            conn.close();
        } catch (SQLException e) {
        }
    }
}
  • メソッドのベストプラクティスでaConnectionを閉じていますか?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 オブジェクトを取得したら、それを使用して、try ブロックに配置された PreparedStatement/Statement/CallableStatement を実行し、ステートメントを閉じるなどの大掃除ジョブと 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 に答える