Какая польза от использования "finally" после блока try-catch в java?
Блок "finally" всегда выполняется, когда try-catch заканчивается, либо в случае исключения, либо нет.
Но также всегда выполняется каждая строка кода снаружи и после try-catch.
Итак, почему я должен использовать утверждение finally?
Пример:
try {
//code...
} catch (Exception e) {
//code...
} finally {
System.out.println("This line is always printed");
}
System.out.println("Also this line is always printed !! So why to use 'finally'?? ");
Ответы
Ответ 1
Самый полезный случай - когда вам нужно освободить некоторые ресурсы:
InputStream is = ...
try {
//code...
} catch (Exception e) {
//code...
} finally {
is.close();
}
В более общем плане вы используете его, когда хотите убедиться, что ваш код выполнен в конце, даже если во время выполнения было исключение:
long startTime = System.currentTimeMillis();
try {
//code...
} catch (Exception e) {
//code...
} finally {
long endTime = System.currentTimeMillis();
System.out.println("Operation took " + (endTime-startTime) + " ms");
}
Идея выполнения этого finally
блока всегда заключается в том, что он не относится к первой строке, следующей за целым блоком
- если блок
catch
разрешает некоторый забрасываемый проход
- если он повторяет исключение, которое очень часто
Ответ 2
Последний System.out.println
(после блока finally) будет запущен только в том случае, если исключение, созданное в блоке try, будет эффективно захвачено блоком catch и если выполнение не прерывается, например. оператор возврата.
В вашем примере блок finally всегда будет запущен, но выполнение будет продолжаться только после блока finally, если в блоке try не выбрано Error
(он не будет пойман), если no Throwable
брошен в блок catch, и нет другого оператора, который прервет выполнение.
Ответ 3
Но также всегда выполняется каждая строка кода снаружи и после try-catch
Это неверно. В случае неконтролируемых исключений (RuntimeException, Error и их подклассы) код после finally
не будет выполняться.
Взгляните на этот код
public static void main(String[] args) {
try{
someDengerousMethod();
} catch (Exception e) {
e.printStackTrace();
}finally{
System.out.println("finally block");
}
System.out.println("after finally...");
}
public static void someDengerousMethod(){
throw new Error("something went wrong");
}
Ответ 4
Блок finally - это ключевой инструмент для предотвращения утечек ресурсов. когда закрывая файл или иным образом восстанавливая ресурсы, поместите код в наконец, блокировать, чтобы гарантировать, что ресурс всегда восстанавливается.
Но, наконец, полезен не только обработка исключений - это позволяет программисту избежать случайного удаления кода очистки обходит возврат, продолжается или прерывается. Ввод кода очистки в наконец, блок всегда является хорошей практикой, даже если никакие исключения не являются ожидается.
Подробнее здесь
Ответ 5
Предположим, что вы пишете в файле, и внезапно он создает исключение, как вы закрываете файл. Затем, наконец, помогите вам, а также для транзакции базы данных, наконец, блок помогает много
Ответ 6
окончательно заблокировать только цель - закрыть ресурсы, которые вы открыли внутри блока try.
ресурсы могут быть похожими на подключения к базе данных, запись/чтение файлов и т.д.:
Connection conn= null;
try {
conn= get the db conn;
//do some DML/DDL
}
catch(SQLException ex) {
}
finally {
conn.close();
}