Java最终阻止问题

Java最终阻止问题,java,exception-handling,try-catch-finally,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; nYe

在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;
    }



}

据我所知不是这样。但是,在这种情况下,只需将
return
放在
catch
块中,您可能会过得更好。
最后
块仍将运行。

据我所知,没有办法做到这一点。
首先,
finally
块的目的是做一些无论是否存在异常都必须做的事情。

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

我偶尔需要这个图案。在正常代码的末尾设置标志,而不是在发生异常时设置标志

boolean success = false;
try
{
   doStuff();
   success = true;
}
finally
{
   if (!success)
   {
      // there was an exception
   }
}
然后,您的finally块知道它是从正常终止还是异常终止调用的


编辑:在finally块中返回被认为是不好的做法,因为它会吞噬异常。这是隐式的,从代码(或语言规范)中看不清楚。正如所写,finally块将阻止传播SQLException。如果这是您想要的,那么对catch块执行此操作,使其显式。请参阅。

+1-很好,因为只有一个
try
块,但可能有许多
catch
块。将返回移动到try块不会产生相同的行为。事实上,最终的回报是所有的例外。如果将其移动到try块,则异常会像正常情况一样传播。请参阅@mdma:我说的是
catch
块,而不是
try
块。@mdma:此外,由于他的代码中的
return
是有条件的,它只会吞下
SQLException
s。是的,您的权利,我忽略了条件。不管怎样,我都建议重新编写或至少对这段代码进行注释,因为它对异常的作用并不明显。这是在jsp页面中。对于异常处理,目的只是将异常返回到屏幕。但我希望确保关闭所有数据库对象,无论是否存在异常。