Допустим есть такой код
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
.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть приложение использованием карт googlemaps, в нем есть вызов popupmenu по нажатию кнопки в верхнем правом углу приложенияТеперь появилась необходимость...
Код при запуске потоков-соединений (подсоединении клиентов) выдаёт ошибку "IOExceptionRunnable"Буду признателен любой подсказке