Зачем нужен finally?

306
19 апреля 2017, 11:34

Допустим есть такой код

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 Не пробовал так, вдруг все упадет :)

Answer 1

Во втором случае если в методе parseJson произойдёт, например, IndexOutOfBoundsException, то метод hideLoadingProgress вызван не будет. Даже если вы отловите исключение где-то выше в коде, индикатор загрузки так и будет отображаться.

Кроме такого "неожиданного" исключения возможна ещё ситуация "неожиданно" появившегося в блоках try и catch оператора return, который, при помещении вызова hideLoadingProgress после finally, опять-таки испортит скрытие индикатора.

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

Примерно то же самое можно прочитать в документации.

Answer 2

Если у вас произойдет исключение, которе вы не обрабатываете (например unchecked), то произойдет выход и метода. Следовательно весь последующий код будет пропущен.

А блок finally выполнится перед выходом из блока try/catch.

READ ALSO
Создание второго PopupMenu

Создание второго PopupMenu

Есть приложение использованием карт googlemaps, в нем есть вызов popupmenu по нажатию кнопки в верхнем правом углу приложенияТеперь появилась необходимость...

211
Интерфейсы в Java

Интерфейсы в Java

Есть два интерфейса:

325
парсить вложенные объекты JSON на java

парсить вложенные объекты JSON на java

Добрый деньИмеется ответ от сайта в формате JSON вида:

332
В чем ошибка в коде многопоточного сервера?

В чем ошибка в коде многопоточного сервера?

Код при запуске потоков-соединений (подсоединении клиентов) выдаёт ошибку "IOExceptionRunnable"Буду признателен любой подсказке

249