2

キャッチブロックから出たばかりかどうかをfinallyブロックで判断する組み込みの方法はありますか?これは以下のような変数で簡単に実行できることは知っていますが、これを実行するための標準の組み込みの方法があるかどうかだけが気になりました。

boolean bException = false;
try
{
    dbf = new DBFunctions();
    dbf.db_run_query(query2);
    dbf.rs.next();
    nMonth = dbf.rs.getInt("calquarter") * 3;
    nYear = dbf.rs.getInt("calyear");

}
catch (SQLException sqle)
{
    out.println(sqle.toString());
    bException = true;
}
finally
{
    dbf.closeConnection();
    if (bException == true)
        return;
}

更新:すべてのデータベースオブジェクトを閉じようとしているcloseConnection()メソッドの内容は次のとおりです。

public void closeConnection()
{

    if (rs != null)
    {
        try { rs.close(); } catch (SQLException e) { ; }
        rs = null;
    }

    if (stmt != null)
    {
        try { stmt.close(); } catch (SQLException e) { ; }
        stmt = null;
    }

    if (con != null)
    {           
        try { con.close(); } catch (SQLException e) { ; }
        con = null;
    }



}
4

3 に答える 3

8

私の知る限りではありません。ただし、この場合は、ブロックのreturn内側に配置するだけの方がよい場合があります。ブロックは引き続き実行されますcatchfinally

于 2011-04-16T15:23:29.473 に答える
4

標準的な方法はありません。言語は、ブロックの正常終了または異常終了の一部として呼び出されたfinallyブロックを区別しません。

私は時々このパターンが必要でした。例外が発生したときにフラグを設定するのではなく、通常のコードの最後にフラグを設定します。

boolean success = false;
try
{
   doStuff();
   success = true;
}
finally
{
   if (!success)
   {
      // there was an exception
   }
}

次に、finallyブロックは、通常の終了から呼び出されているのか、例外的な終了から呼び出されているのかを認識します。

編集:例外を飲み込むので、finallyブロックに戻ることは良い習慣とは見なされません。これは暗黙的であり、コード(または言語仕様!)からは明確ではありません。記述されているように、finallyブロックはSQLExceptionの伝播を停止します。それが必要な場合は、catchブロックを使用してこれを実行し、明示的にします。Javaのfinallyブロックからの復帰を参照してください。

于 2011-04-16T15:27:50.307 に答える
2

私の知る限り、それを行う方法はありません。そもそも、finallyブロックの目的は、例外があるかどうかに関係なく、実行しなければならないことを実行することです。

于 2011-04-16T15:23:48.107 に答える