Почему наконец-то пригодится в java?

Интересно, почему finally полезен после try catch теста? В любом случае код, определенный после оператора finally, будет выполнен.

В чем разница между этими двумя кодами?

try{
    int a = 1 / 0;
} catch(ArithmeticException e){
    System.out.print("Hi");
} finally {
    System.out.print("It's me again...");
}

а также :

    try{
    int a = 1 / 0;
} catch(ArithmeticException e){
    System.out.print("Hi");
}
System.out.print("It's me again...");

Даже если ошибка обнаружена, будет отображаться "It's me again..." ..


person M.Ferru    schedule 11.05.2017    source источник


Ответы (3)


Для начала, если поток System.out закрыт и блок catch вызывает исключение, то блок finally все равно будет выполняться. Таким образом, эти два понятия не эквивалентны. Итак, в контексте:

System.out.close();
try{
    int a = 1 / 0;
} catch(ArithmeticException e){
    System.out.print("Hi");
} finally {
    System.out.print("It's me again...");
}

Наконец-то сделаю хотя бы попытку написать в out. Этого не будет, если вы напишете его после блока _5 _-_ 6_.

finally полезен по нескольким причинам:

  1. Обычно существует вероятность того, что код в блоке try вызывает другое исключение, которое указано в блоке (ах) catch, в этом случае finally все равно будет выполняться.

  2. если в блоке try есть _11 _ / _ 12 _ / _ 13_ оператор, который действует за пределами блока try (например, break в try в цикле for), он не будет выполнен, если вы его напишете после try также будет вызываться finally. Это также приводит к более элегантному коду. Например:

    BufferedReader br = new BufferedReader(new FileReader("file.txt"));
    
    try {
        return br.readLine();
    } finally {
        br.close();
    }

    Обратите внимание на оператор return: если вы выполните close файла без finally, вам потребуется определить переменную и т. Д. (Кроме того, если что-то пойдет не так при чтении файла, он, конечно, не закроет файл).

  3. если catch блоки в свою очередь вызывают исключение, в конце концов они снова будут выполнены.

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

try {
    throw new SomeException("The culprit!");
} finally {
    System.out.println("Some closing words.");
}

Построенный SomeException и его трассировка стека не «перебрасываются» блоком finally: трассировка стека не изменяется. Таким образом, исправитель может узнать, где изначально было сгенерировано исключение.

В общем, хорошо записывать все, что должно быть сделано, прежде чем оставить блок try-catch (с нулем или более catches) в finally, поскольку это защищает вас от всех видов угловых случаев.

Что же касается теории языков программирования, то return, break, continue, throw и т. Д. - все это механизмы изменения пути кода. Заявление finally гарантирует, что в случае такого поведения вы будете защищены. Если позже разработчики Java представят новый механизм, ваш код все еще будет «защищен». Всегда рекомендуется использовать инфраструктуру, предлагаемую языком программирования, поскольку разработчики учитывают все эти возможности.

person Willem Van Onsem    schedule 11.05.2017

Из документов

Это гарантирует выполнение блока finally даже в случае возникновения непредвиденного исключения.

Обратите внимание на термин неожиданный. То, что вы показываете, является ожидаемым исключением.

person Suresh Atta    schedule 11.05.2017

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

Примером может быть закрытие файла в блоке finally.

person Bill F    schedule 11.05.2017