Java наконец-то заблокировать вопрос - PullRequest
2 голосов
/ 16 апреля 2011

Есть ли встроенный способ для определения в блоке 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 ]

8 голосов
/ 16 апреля 2011

Не так, как я знаю. В этом случае, однако, вам может быть лучше, просто поместив return внутри блока catch. Блок finally все еще будет работать.

4 голосов
/ 16 апреля 2011

Стандартного способа не существует - язык не различает блок finally, вызываемый как часть нормального или ненормального завершения блока.

Мне иногда нужна была эта модель.Вместо того, чтобы устанавливать флаг при возникновении исключения, установите его в конце нормального кода.

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

Тогда ваш блок finally знает, вызывается ли он из нормального или исключительного завершения.

РЕДАКТИРОВАТЬ: Возвращение в блоке finally не считается хорошей практикой, поскольку оно поглощает исключения.Это неявно и не ясно из кода (или из спецификации языка!). Как написано, ваш блок finally не даст распространиться исключению SQLException.Если это то, что вы хотите, то сделайте это с блоком catch, чтобы сделать его явным.См. Возвращение из блока finally в Java .

2 голосов
/ 16 апреля 2011

Насколько я знаю, нет способа сделать это. Во-первых, цель блока finally состоит в том, чтобы сделать что-то, что должно быть сделано независимо от того, есть ли исключение или нет.

...