0

結果セットを他のメソッドに渡している場所で、結果セットが既に閉じられています。どこで結果セットを閉じる必要がありますか。

public void mainTest(){

ResultSet rs= pstmt.executeQuery(query);

List list = populateRS(rs);

if(rs!=null)rs.close();
}

public List populateRS(ResultSet rs){

//work with result set
if(rs!=null)rs.close();
}
4

6 に答える 6

3

AutoCloseableを実装しているため、例外が発生するかどうかにかかわらず、ResultSet を自動的に閉じる新しいtry-with-resources ステートメントを使用します。

try-with-resources ステートメントは、1 つ以上のリソースを宣言する try ステートメントです。リソースは、プログラムが終了した後に閉じる必要があるオブジェクトです。try-with-resources ステートメントは、各リソースがステートメントの最後で確実に閉じられるようにします。

public void mainTest()
{
  try (ResultSet rs = pstmt.executeQuery(query)) { 
     List list = populateRS(rs);
  } catch (SQLException ex) {

  }
}

public List populateRS(ResultSet rs){
    // work with result set
}
于 2013-08-13T19:06:10.963 に答える
2

開いているところを閉じるのがよい。finallyブロック
ですべてのリソースを閉じることは、良いプログラミング方法です。

       public void mainTest()
       {
         ResultSet rs = null;
         try{ 
              rs= pstmt.executeQuery(query);
             List list = populateRS(rs);
          }finally{
               try {
                 rs.close();
               } catch (SQLException ex) {

               }
          }
      }

     public List populateRS(ResultSet rs){

        //work with result set

    }

Javaドキュメントによると

例外が予想されない場合でも、最終ブロックにクリーンアップ コードを配置することは常に良い方法です。

于 2013-08-13T18:54:42.797 に答える
1

開いた場所の近くにあるものを閉じます。この場合、populateRS を呼び出した後、mainTest メソッドになります。メソッドが何かを開かない場合、それを閉じるべきではありません。

于 2013-08-13T18:50:56.080 に答える