Подтвердить что ты не робот

Какая польза от использования "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'?? ");
4b9b3361

Ответ 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();
}