Для начала, если поток 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
полезен по нескольким причинам:
Обычно существует вероятность того, что код в блоке try
вызывает другое исключение, которое указано в блоке (ах) catch
, в этом случае finally
все равно будет выполняться.
если в блоке 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
, вам потребуется определить переменную и т. Д. (Кроме того, если что-то пойдет не так при чтении файла, он, конечно, не закроет файл).
если catch
блоки в свою очередь вызывают исключение, в конце концов они снова будут выполнены.
Это также позволяет вам выполнять некоторые действия после того, как исключение было выброшено, но без перехвата исключения: исключение выбрасывается дальше, если оно никогда не перехватывается. В случае:
try {
throw new SomeException("The culprit!");
} finally {
System.out.println("Some closing words.");
}
Построенный SomeException
и его трассировка стека не «перебрасываются» блоком finally
: трассировка стека не изменяется. Таким образом, исправитель может узнать, где изначально было сгенерировано исключение.
В общем, хорошо записывать все, что должно быть сделано, прежде чем оставить блок try-catch
(с нулем или более catch
es) в finally
, поскольку это защищает вас от всех видов угловых случаев.
Что же касается теории языков программирования, то return
, break
, continue
, throw
и т. Д. - все это механизмы изменения пути кода. Заявление finally
гарантирует, что в случае такого поведения вы будете защищены. Если позже разработчики Java представят новый механизм, ваш код все еще будет «защищен». Всегда рекомендуется использовать инфраструктуру, предлагаемую языком программирования, поскольку разработчики учитывают все эти возможности.
person
Willem Van Onsem
schedule
11.05.2017