наконец, в обработке исключений - PullRequest
5 голосов
/ 24 марта 2010

Что именно выполняет блок finally при обработке исключений?

Ответы [ 8 ]

8 голосов
/ 24 марта 2010

Содержит код, который должен выполняться всегда, независимо от того, происходит ли исключение.

Например, если вы открыли файл, вы должны закрыть его в блоке finally, чтобы он всегда был закрыт; если вы закрыли его в блоке try, более раннее исключение приведет к тому, что выполнение перейдет прямо к блоку catch и пропустит закрытие файла.

Подробнее см. В руководствах по Java .

4 голосов
/ 24 марта 2010

Блок finally всегда выполняется независимо от того, было ли выброшено исключение. Классический пример использования, о котором я могу подумать, это закрытие файлов.

FileOutputStream stream = null;
try{
    // do stuff with the stream here
} catch (IOException ex){
    // handle exception
} finally{
    // always close the stream
    if(stream != null){
        stream.close();
    }
}
3 голосов
/ 24 марта 2010

Выполняется независимо от того, попадаете ли вы в блок catch или нет, это означает, что это отличное место для удаления предметов и выполнения других очисток.

2 голосов
/ 24 марта 2010

Я часто использую его для очистки открытых ресурсов, когда в блоке кода есть несколько операторов return, что делает код намного чище, так как вам не нужно клонировать один и тот же код «close resource» перед каждым оператором return , Гарантируется, что код вызовет раздел finally, даже если вы делаете возврат в разделе try. В этом случае это также помогает с безопасностью кода, так как программист может легко пропустить это случайно.

0 голосов
/ 14 января 2018

Несмотря на то, что уже было дано много ответов, блок finally требуется для выполнения некоторого фрагмента кода во всех условиях, независимо от того, есть ли какое-то прерывание из-за исключения или какой-то неверный код, или вы возвращаете поток управления программой из try block, здесь я добавляю пример для объяснения необходимости finally block;

Предположим, вы одолжили ручку у вашего друга. Вы используете его, а затем возвращаетесь (я считаю вас джентльменом). Теперь, что бы ни случилось, вы должны вернуть ручку. Вы можете справиться с различными ситуациями и поставить самое неизбежное условие в блок finally.

//Borrow the pen
try{
  //Use the pen
}catch(StolenPen how){
  //Buy new pen
}catch(InkFinished how){
  //Refill the pen
}catch(SomethingWrong how){
  //Buy new pen
}finally{
  //Return new pen
}
0 голосов
/ 18 августа 2015

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

например:

 try{
     }
     catch(Exception e){
     }
      finally{
             System.out.print("finally executed");
            }

Примечание: в указанном выше случае, наконец, всегда будет выполняться.

0 голосов
/ 03 апреля 2015

Блок finally в основном используется для выполнения оператора close, например, con.close , то есть для закрытия соединения с базой данных .... блок try всегда сопровождается либо блоком catch, либо finally (или и тем и другим) ... Если вы однажды вошли в блок try, то ваш блок finally будет определенно исполнен, за исключением системной ошибки, исключение в блоке finally .... Основная ключевая точка блока finally заключается в том, что он всегда выполняется даже исключение обработано или нет ..

0 голосов
/ 21 октября 2011

Если вы возвращаете значение в блоке try или catch, а также в блоке finally, имейте в виду, что возвращаемое значение блока finally - это то, что вы в итоге получите (последнее блок выполнен). Это означает, что если вы try какой-то код, который НЕ выдает Exception и должен возвращать значение, но ваш блок finally также должен возвращать значение, то значение блока finally будет таким, каким оно будет на самом деле. вернулся. Этот SO поток говорит именно об этом. Я не верю, что возвращение значения внутри try или catch обычно необходимо или лучшая идея. Также обратите внимание, что System.exit(0) убивает JVM и, таким образом, останавливает выполнение, прежде чем что-либо еще выполняется, что может сделать ваш блок finally неисполненным.

...