AsyncTask падает при парсинге html страницы

202
03 августа 2017, 23:14

Суть приложения такова, что я ввожу какие-то символы, которыми дополняются определенный url и с этого url уже идет парсинг нужных мне значений. При вводе правильных значений все работает как нужно, но вот если ввожу случайно символы которых не существует то приложение падает (хотя экспешены вроде все прописаны). Вот текст ошибки:

    FATAL EXCEPTION: AsyncTask #1
Process: m.masyuk.com.fb.stackinfo, PID: 3901
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:318)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.get(ArrayList.java:411)
at m.masyuk.com.fb.stackinfo.MainActivity$SetInfo.doInBackground(MainActivity.java:260)
at m.masyuk.com.fb.stackinfo.MainActivity$SetInfo.doInBackground(MainActivity.java:234)
at android.os.AsyncTask$2.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)

И сам код:

    private class SetInfo extends AsyncTask<String, Void, String> {
    private TextView textViewForImport;
    private int numImport;
    private String code;
    SetInfo(TextView textViewForImport, String code, int numImport) {
        this.textViewForImport = textViewForImport;
        this.code = code;
        this.numImport = numImport;
    }
    @Override
    protected String doInBackground(String... params) {
        String url = params[0];
        String stackInfo = "";
        org.jsoup.nodes.Document doc;
        try {
            doc = Jsoup.connect(url).get();
            Element mc_element = doc.select(code).get(numImport);
            stackInfo = mc_element.text();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stackInfo;
    }
    @Override
    protected void onPostExecute(String aVoid) {
        textViewForImport.setText(aVoid);
    }
}

ЗЫ Вот 260 строка, на которую указывает ошибка

Element mc_element = doc.select(code).get(numImport);
Answer 1

Ошибка Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 в данном примере говорит о том, что вы пытаетесь получить данные, которых нет. Перед получение следует проверить, есть ли вообще эти данные:

doc = Jsoup.connect(url).get();
if (!doc.select(code).isEmpty()) {
    Element mc_element = doc.select(code).get(numImport);
    stackInfo = mc_element.text();
}

приложение падает (хотя экспешены вроде все прописаны)

Вы ловите только IOException, а на деле получаете IndexOutOfBoundsException, который остаётся непойманым. Чтобы ловить все исключения, нужно указывать тип Exception.

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

READ ALSO
Проблема с Apache camel jaxb marshalling

Проблема с Apache camel jaxb marshalling

Добрый деньЧитаю Camel in Action, там есть пример маршаллинга в xml с помощью jaxb Spring XML

244
Django - 500 Internal Server Error в ajax post request

Django - 500 Internal Server Error в ajax post request

Всем доброго времени суток

273
Carousel bootstrap c fade-эффектом

Carousel bootstrap c fade-эффектом

Здравствуйте! Нашел в сети только один пример нормально работающей bootstrap карусели с эффектом fadeАвтор предлагает решить его с помощью css-файла...

265
Не загружается файл в php

Не загружается файл в php

Всем приветПомогите с проблемой

231