Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 17 дек 2018, 04:23

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
СообщениеДобавлено: 29 авг 2014, 10:37 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
Я не знал как точно назвать данную тему, но остановился на этом. Допустим есть код

Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1.     public static List<TrackerType> myRequest() throws ApiException {
  2.         HttpURLConnection urlConnection = null;
  3.         urlConnection = openConnection(MY_URL);
  4.         int responseCode = urlConnection.getResponseCode();
  5.         if (HttpURLConnection.HTTP_OK == responseCode) {
  6.             CookieController.getInstance().writeCookies();
  7.             InputStreamReader reader = new InputStreamReader(urlConnection.getInputStream());
  8.             String response = new Gson().fromJson(reader, String.class);
  9.             return response;
  10.         }
  11.     }
  12.  

Код упростил. openConnection допустим подключает нас к серверу. Не суть.
IDE вежливо нас попросит обработать исключения, которые выбрасывают методы. Код станет таким
Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1.     public static List<TrackerType> myRequest() throws ApiException {
  2.         HttpURLConnection urlConnection = null;
  3.         urlConnection = openConnection(MY_URL);
  4.         int responseCode = 0;
  5.         try {
  6.             responseCode = urlConnection.getResponseCode();
  7.         } catch (IOException e) {
  8.             e.printStackTrace();
  9.         }
  10.         if (HttpURLConnection.HTTP_OK == responseCode) {
  11.             CookieController.getInstance().writeCookies();
  12.             InputStreamReader reader = null;
  13.             try {
  14.                 reader = new InputStreamReader(urlConnection.getInputStream());
  15.             } catch (IOException e) {
  16.                 e.printStackTrace();
  17.             }
  18.             String response = new Gson().fromJson(reader, String.class);
  19.             return response;
  20.         }
  21.     }
  22.  

Т.е. в классе InputStream есть указание выбрасываемого исключения
Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1. public InputStream getInputStream() throws IOException {...}

Логично? Логично. Но и метод fromJson, он тоже выбрасывает исключения
Код: [ Загрузить ] [ Скрыть ]
Using Java(TM) 2 Platform Standard Edition 5.0 Syntax Highlighting
  1. public <T> T fromJson(Reader json, Class<T> classOfT) throws JsonSyntaxException, JsonIOException {...}

Они унаследованы от
Цитата:
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.

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 авг 2014, 10:56 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
Мне создали сразу две темы с одним именем. Ту закрыл. (и удалить теперь ту тему не получается)

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 авг 2014, 11:33 
Аватар пользователя

Зарегистрирован: 13 ноя 2013, 14:46
Сообщений: 1956
Благодарил (а): 10 раз.
Поблагодарили: 275 раз.
Далеко не факт, данные на вход приходят, как и статус ответа от сервера, json то всеравно сервер отдает, просто с ошибкой, да если там проблемы с сетью или сервером - это IOException, но все остальное только Runtime, ошибка то определяется когда происходит парсинг, либо просто обработка 404, либо ошибки возвращенной сервером или просто другая структура вложенности либо другие ключи, это вылазит только в runtime.
А по поводу IDE - фиг зняет они вообще часто тупят, но JsonSyntaxException -это же исключение из Gson вроде, возможно у тебя не такие жесткие настройки warning -ов и она просто пропускает сторонние библиотеки, а может кто -то ее явно попросил не обращать внимание.

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

_________________
Изображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 авг 2014, 11:59 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
Все, до меня дошло. Да, тут все логично. В принципе то, что не показывает Runtime исключения - это очень верно, ибо кому захочется видеть при каждом get из коллекции предупреждения, что ты можешь выйти за границу массива.

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB