0

次のコードサンプルがあります。

try {
    conn = this.jdbcTemplate.getDataSource().getConnection();
    stm = conn.prepareCall("{? =" + query + "}");
    stm.registerOutParameter(1, OracleTypes.CURSOR);
    if (params != null) {
        for (int i = 0; i < params.length; i++)
            stm.setString(i + 2, params[i]);
    }
    //getting result set from cursor
    stm.execute();
    res = (ResultSet) stm.getObject(1);
    return DatabaseLayerUtils.getResultSetData(res);
} finally {
    //closing cursor
    if (res != null) res.close();
    if (stm != null) stm.close();
    if (conn != null) conn.close();
}

セクション内の要素の順序はfinally重要ですか?

次のコードです:

 if (res != null) res.close();
 if (stm != null) stm.close();

に等しい:

 if (stm != null) stm.close();
 if (res != null) res.close();

か否か?

私の同僚が取り組んでいるプロジェクトには、次のような多くの構造があります。

 if (stm != null) stm.close();
 if (res != null) res.close();

これが正しい構文かどうか、または次のように修正する必要があるかどうかを理解する必要があります。

 if (res != null) res.close();
 if (stm != null) stm.close();

ありがとう。

4

2 に答える 2

1

finally セクションの要素の順序は重要ですか?

はい。最初に接続を閉じると、他の接続は冗長になるため、省略できます。すべてを閉じたい場合は、取得の逆の順序で行う必要があります。

明快さと柔軟性を最大限に高めるために、次のようにします。

Connection conn = ...;
try
{
  PreparedStatement ps  = ...;
  try
  {
    // ps.setXXXXX() ...
    ResultSet rs = ps.executeQuery();
    try
    {
      // ...
    }
    finally
    {
      rs.close();
    }
  }
  finally
  {
    ps.close();
  }
}
finally
{
  conn.close();
}

そうすれば、逃げ場がないことを知って夜眠ることができます;-)ヌルテストも必要ありません。

于 2013-04-15T04:07:07.443 に答える