java пытается заблокировать catch, что возвращать

#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; или что-то, что вы хотите вернуть в случае, если попытка завершится неудачей.