Java终于阻止了问题

时间:2011-04-16 15:20:46

标签: java exception-handling try-catch-finally

是否有一种内置方法可以在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;
    }



}

3 个答案:

答案 0 :(得分:8)

据我所知。但是,在这种情况下,只需将return放在catch块内即可。 finally块仍将运行。

答案 1 :(得分:4)

没有标准的方法 - 语言不区分finally块被称为块的正常或异常终止的一部分。

我偶尔需要这种模式。发生异常时不要设置标志,而是将其设置在普通代码的末尾。

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

然后你的finally块知道它是从正常终止还是异常终止调用。

编辑:在finally块中返回并不是一种好习惯,因为它会吞没异常。这是隐含的,并且不清楚代码(或语言规范!)。如上所述,finally块将阻止SQLException传播。如果这是您想要的,那么使用catch块执行此操作,以使其明确。请参阅Returning from a finally block in Java

答案 2 :(得分:2)

据我所知,没有办法做到这一点。 首先,finally阻止的目的是做一些必须要做的事情,无论是否有例外。