У меня есть несколько вопросов о наилучшем использовании исключений в Java.
Рассмотрим код ниже:
private String doHttpGetRequest(String url) throws IOException {
...
}
private Photo processJson(String json) throws JSON Exception{
...
}
private Photo getPhoto() throws IOException, JSON Exception {
String url = "http://...";
String response = doHttpGetRequest(url);
Photo photo = processJson(response);
photo.downloadImage();
return photo;
}
public static void main(String args[]) {
Photo p = null;
try {
p = getPhoto();
} catch( JSONException j ) {
// Re-try a few times, then display user alert
} catch( IOException e ) {
// Re-try a few times, then display user alert
}
if( p!=null)
// now display photo
}
Этот код предназначен для приложения для Android, в котором соединение может быть не очень надежным, поэтому я хотел бы несколько раз повторить попытку метода getPhoto (), чтобы посмотреть, сработает ли он, а затем завершить работу и предупредить пользователя.
Мои вопросы:
Я открываю InputStream в doHttpGetRequest (), и этот метод вызывает IOException. Как закрыть InputStream, если он выдал исключение? Без блока finally внутри метода, который позволил бы мне закрывать ресурсы, я запутался.
В main () меня интересует только, работает ли getPhoto () или не работает. Не лучше ли окружить операторы внутри getPhoto () блоком try / catch и перехватить JSONException, создавая новое IOException, когда оно перехватывается? Это приведет к тому, что в main () придется отлавливать только один тип исключений, что приведет к более простому коду и отсутствию дублирующих функций.
Если p.getPhoto () выдает исключение, я хочу повторить попытку (возможно, дважды), а затем отобразить предупреждение пользователя, если это не удалось. Есть ли общая структура программирования для этого?