#java #android #try-catch
#java #Android #попробуйте-catch
Вопрос:
Сегодня днем мне было очень весело использовать Gson от Google для синтаксического анализа Json, но я писал этот код здесь:
public class Fetcher extends AsyncTask<String, Void, JsonReader> {
@Override
protected JsonReader doInBackground(String... urlString) {
try {
URL url = new URL(urlString[0]);
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
JsonReader jReader = new JsonReader(reader);
return jReader;
} catch(MalformedURLException malformedEx) {
Log.e("malformed url: ", "here are the details: ", malformedEx);
} catch(IOException ioEx) {
Log.e("IO problem: ", "here are the details: ", ioEx);
} catch(Exception generalEx) {
Log.e("an exception we did not expect: ", "here are the details: ", generalEx);
}
//return statement here
}
}
Очевидно, что он будет жаловаться на то, что я пропускаю оператор return, но я не уверен, что возвращать, поскольку мне нужно поместить JsonReader в блок try, и я не могу просто создать пустой, поскольку для него нет конструктора. Я не думал, что мне придется просить об этом. Идеи, пожалуйста.
Комментарии:
1. Что он должен вернуть в случае сбоя?
null
? Должно ли это вызывать исключение?2. @SotiriosDelimanolis да
3. в целом это хороший совет, но поскольку это выполняется в AsyncTask, создание исключения оттуда может быть сложным.
Ответ №1:
Если вы хотите перехватывать исключения (уверены, что хотите?), то return null
это может быть правильным выбором.
Ответ №2:
Я думаю, что лучшим вариантом должно быть
public class Fetcher extends AsyncTask<String, Void, JsonReader> {
@Override
protected JsonReader doInBackground(String... urlString) {
JsonReader jReader = null;
try {
URL url = new URL(urlString[0]);
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
jReader = new JsonReader(reader);
} catch(MalformedURLException malformedEx) {
Log.e("malformed url: ", "here are the details: ", malformedEx);
} catch(IOException ioEx) {
Log.e("IO problem: ", "here are the details: ", ioEx);
} catch(Exception generalEx) {
Log.e("an exception we did not expect: ", "here are the details: ", generalEx);
} finally {
// CLOSE YOUR STREAMS
}
return jReader;
}
}
Но не забудьте протестировать jreader перед его использованием, иначе вы можете получить исключение с нулевым указателем.
if (jReader!=null) {
//do something
}
Примечание: явное значение return null; не является хорошей практикой программирования, равно как и два оператора return.
Ответ №3:
Поскольку методу необходимо что-то вернуть, и попытка / catch может завершиться неудачей, вам нужно что-то вернуть в случае невозможности достичь инструкции return в try / catch.
Вы должны return null;
или что-то, что вы хотите вернуть в случае, если попытка завершится неудачей.