Допустим есть такой код
try {
parseJson(response.json);
}
catch(JSONException e) {
Log.v("err", e.toString());
}
finally {
hideLoadingProgress();
}
response.json это JSONObject, приходит с сервера. В try я передаю его методу на обработку, в catch вывожу ошибки в логи, в finally я скрываю индикатор загрузки. Тоесть, не важно, успешно ли завершится парсинг или нет, индикатор в любом случае убираем. Но зачем finally? Я же могу сделать так
try {
parseJson(response.json);
}
catch(JSONException e) {
Log.v("err", e.toString());
}
hideLoadingProgress();
P.S Не пробовал так, вдруг все упадет :)
Во втором случае если в методе parseJson произойдёт, например, IndexOutOfBoundsException, то метод hideLoadingProgress вызван не будет. Даже если вы отловите исключение где-то выше в коде, индикатор загрузки так и будет отображаться.
Кроме такого "неожиданного" исключения возможна ещё ситуация "неожиданно" появившегося в блоках try и catch оператора return, который, при помещении вызова hideLoadingProgress после finally, опять-таки испортит скрытие индикатора.
В блок finally помещают код, который гарантированно должен быть вызван (кроме случаев завершения работы JVM или текущего потока посреди блоков try и catch). Таким кодом, например, является закрытие использованных в блоке try ресурсов для предотвращения утечек. В случае UI - например, индикатор загрузки.
Примерно то же самое можно прочитать в документации.
Если у вас произойдет исключение, которе вы не обрабатываете (например unchecked), то произойдет выход и метода. Следовательно весь последующий код будет пропущен.
А блок finally выполнится перед выходом из блока try/catch.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей