Обработка исключений, GSON и Java в общем.

Ответить
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Обработка исключений, GSON и Java в общем.

Сообщение Mikhail_dev » 29 авг 2014, 10:37

Я не знал как точно назвать данную тему, но остановился на этом. Допустим есть код

[syntax=java5]
public static List<TrackerType> myRequest() throws ApiException {
HttpURLConnection urlConnection = null;
urlConnection = openConnection(MY_URL);
int responseCode = urlConnection.getResponseCode();
if (HttpURLConnection.HTTP_OK == responseCode) {
CookieController.getInstance().writeCookies();
InputStreamReader reader = new InputStreamReader(urlConnection.getInputStream());
String response = new Gson().fromJson(reader, String.class);
return response;
}
}
[/syntax]
Код упростил. openConnection допустим подключает нас к серверу. Не суть.
IDE вежливо нас попросит обработать исключения, которые выбрасывают методы. Код станет таким
[syntax=java5]
public static List<TrackerType> myRequest() throws ApiException {
HttpURLConnection urlConnection = null;
urlConnection = openConnection(MY_URL);
int responseCode = 0;
try {
responseCode = urlConnection.getResponseCode();
} catch (IOException e) {
e.printStackTrace();
}
if (HttpURLConnection.HTTP_OK == responseCode) {
CookieController.getInstance().writeCookies();
InputStreamReader reader = null;
try {
reader = new InputStreamReader(urlConnection.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
String response = new Gson().fromJson(reader, String.class);
return response;
}
}
[/syntax]
Т.е. в классе InputStream есть указание выбрасываемого исключения
[syntax=java5]public InputStream getInputStream() throws IOException {...}[/syntax]
Логично? Логично. Но и метод fromJson, он тоже выбрасывает исключения
[syntax=java5]public <T> T fromJson(Reader json, Class<T> classOfT) throws JsonSyntaxException, JsonIOException {...}[/syntax]
Они унаследованы от
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException
com.google.gson.JsonParseException
Т.е. другими словами, IDE должна была нас попросить и эти исключения обработать, однако этого не произошло. Я только после получения ошибок, нашел сиё дело.

Собственно вопрос №1: Почему?
Я не уверен в том, что это виновата IDE. Хотя может и она, и может и не виновата. Есть одна мысль у меня: IDE не указывает про эти исключения, ибо они должны не отлавливаться через try catch, а обрабатываться разработчиком через условия, т.е. также, как и с выходом за границы массива (ArrayIndexOutofBoundsException), либо NullpointerException.

Вопрос №2: почему данные исключения унаследуются от java.lang.RuntimeException ? Это же исключения, которые по хорошему счету нельзя отлавливать через try catch. Но к примеру ошибка JsonSyntaxException может быть причиной неверного формата данных с сервера. JsonIOException - она может вылазить при ошибке чтения потока, при проблемах интернета. Это же по сути обычные IOException, но никак не RuntimeException.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Обработка исключений, GSON и Java в общем.

Сообщение Mikhail_dev » 29 авг 2014, 10:56

Мне создали сразу две темы с одним именем. Ту закрыл. (и удалить теперь ту тему не получается)

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Обработка исключений, GSON и Java в общем.

Сообщение altwin » 29 авг 2014, 11:33

Далеко не факт, данные на вход приходят, как и статус ответа от сервера, json то всеравно сервер отдает, просто с ошибкой, да если там проблемы с сетью или сервером - это IOException, но все остальное только Runtime, ошибка то определяется когда происходит парсинг, либо просто обработка 404, либо ошибки возвращенной сервером или просто другая структура вложенности либо другие ключи, это вылазит только в runtime.
А по поводу IDE - фиг зняет они вообще часто тупят, но JsonSyntaxException -это же исключение из Gson вроде, возможно у тебя не такие жесткие настройки warning -ов и она просто пропускает сторонние библиотеки, а может кто -то ее явно попросил не обращать внимание.

Опятьже тип исключения - это вопрос реализации, если человек просто хочет чтобы IO постоянно перезапрашивала ввод, а Runtime выкидывал fatal error для всего приложения -это только его дело, к какому типу исключений относить то или иное событие, которое он считает критичным, потому это скорее вопрос к разработчика gson :)
Изображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Обработка исключений, GSON и Java в общем.

Сообщение Mikhail_dev » 29 авг 2014, 11:59

Все, до меня дошло. Да, тут все логично. В принципе то, что не показывает Runtime исключения - это очень верно, ибо кому захочется видеть при каждом get из коллекции предупреждения, что ты можешь выйти за границу массива.

Ответить