Обработка исключений, GSON и Java в общем.
Добавлено: 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]
Они унаследованы от
Собственно вопрос №1: Почему?
Я не уверен в том, что это виновата IDE. Хотя может и она, и может и не виновата. Есть одна мысль у меня: IDE не указывает про эти исключения, ибо они должны не отлавливаться через try catch, а обрабатываться разработчиком через условия, т.е. также, как и с выходом за границы массива (ArrayIndexOutofBoundsException), либо NullpointerException.
Вопрос №2: почему данные исключения унаследуются от java.lang.RuntimeException ? Это же исключения, которые по хорошему счету нельзя отлавливать через try catch. Но к примеру ошибка JsonSyntaxException может быть причиной неверного формата данных с сервера. JsonIOException - она может вылазить при ошибке чтения потока, при проблемах интернета. Это же по сути обычные IOException, но никак не RuntimeException.
[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]
Они унаследованы от
Т.е. другими словами, IDE должна была нас попросить и эти исключения обработать, однако этого не произошло. Я только после получения ошибок, нашел сиё дело.java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException
com.google.gson.JsonParseException
Собственно вопрос №1: Почему?
Я не уверен в том, что это виновата IDE. Хотя может и она, и может и не виновата. Есть одна мысль у меня: IDE не указывает про эти исключения, ибо они должны не отлавливаться через try catch, а обрабатываться разработчиком через условия, т.е. также, как и с выходом за границы массива (ArrayIndexOutofBoundsException), либо NullpointerException.
Вопрос №2: почему данные исключения унаследуются от java.lang.RuntimeException ? Это же исключения, которые по хорошему счету нельзя отлавливать через try catch. Но к примеру ошибка JsonSyntaxException может быть причиной неверного формата данных с сервера. JsonIOException - она может вылазить при ошибке чтения потока, при проблемах интернета. Это же по сути обычные IOException, но никак не RuntimeException.