2

是否有一种内置方法可以在 finally 块中确定您是否刚从 catch 块中出来?我知道这可以通过如下所示的变量轻松完成,但我只是好奇是否有一种标准的内置方法可以做到这一点。

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但是,在这种情况下,只需将块放在块内可能会更好catch。该finally块仍将运行。

于 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

据我所知,没有办法做到这一点。首先,finallyblock的目的是做一些不管有没有异常都必须做的事情。

于 2011-04-16T15:23:48.107 回答