Как обрабатывать исключения в Android с помощью throw - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь получить информацию с веб-сайта и отобразить ее в приложении Android. Второй ответ на вопрос « Какой самый быстрый способ очистки HTML веб-страницы в Android? » предложил использовать BufferedReader. В ответе человек использует класс URL. Я попытался реализовать ответ следующим образом:

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import java.net.URL;

public class MainActivity extends AppCompatActivity {
    TextView display = (TextView) findViewById(R.id.textDisplay);

    @Override
    protected void onCreate(Bundle savedInstanceState) throws Exception {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        URL url = new URL("http://stackoverflow.com/questions/2971155");
        BufferedReader reader = null;
        StringBuilder builder = new StringBuilder();
        try {
            reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
            for (String line; (line = reader.readLine()) != null; ) {
                builder.append(line.trim());
            }
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException logOrIgnore) {
                    logOrIgnore.printStackTrace();
                }
            }
        }
        String start = "<div class=\"post-text\"><p>";
        String end = "</p>";
        String part = builder.substring(builder.indexOf(start) + start.length());
        String question = part.substring(0, part.indexOf(end));
        TextView display = (TextView) findViewById(R.id.textDisplay);
        display.setText(question);

    }


}

Я получил эту ошибку:

'onCreate(Bundle)' in 'com.example.myproject.MainActivity' clashes with 
'onCreate(Bundle)' in 'android.appcompat.app.AppCompatActivity';
 overridden method does not throw 'java.lang.Exception'

Что бы вы предложили для решения этой проблемы, это умный способ получения данных с сайта? Любая помощь очень ценится

Ответы [ 3 ]

0 голосов
/ 04 марта 2020

Измените код следующим образом

    public class MainActivity extends AppCompatActivity {
        TextView display = (TextView) findViewById(R.id.textDisplay);

        @Override
        protected void onCreate(Bundle savedInstanceState) throws Exception {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

try{
            URL url = new URL("http://stackoverflow.com/questions/2971155");
            BufferedReader reader = null;
            StringBuilder builder = new StringBuilder();
            try {
                reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
                for (String line; (line = reader.readLine()) != null; ) {
                    builder.append(line.trim());
                }
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException logOrIgnore) {
                        logOrIgnore.printStackTrace();
                    }
                }
            }
            String start = "<div class=\"post-text\"><p>";
            String end = "</p>";
            String part = builder.substring(builder.indexOf(start) + start.length());
            String question = part.substring(0, part.indexOf(end));
            TextView display = (TextView) findViewById(R.id.textDisplay);
            display.setText(question);
}catch(Exception ex){
Log.e("EEXCCEption","ex.localizedMessage.toString()")

}

        }


    }

, и в файле Logger вы можете получить фактическую причину исключения.

0 голосов
/ 04 марта 2020

onCreate() метод является частью жизненного цикла Activity, вы просто переопределяете его (примечание @Override), а не пишете собственные, поэтому вы не можете изменять атрибуты, возвращая тип или добавлять / удалять throws объявления

удалить throws Exception из protected void onCreate(Bundle savedInstanceState) throws Exception { - это вызывает ваше исключение

и использовать try{}catch{}, например

try {
    reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
    for (String line; (line = reader.readLine()) != null; ) {
        builder.append(line.trim());
    }
} catch(Exception e){
    e.printStackTrace();
    //TODO handle exception by own, don't throw outside onCreate, it will break lifecycle
} finally {
    ...

@ Neeraj, это не так, на самом деле это это единственное, что вы можете изменить - доступность класса (public, protected et c.) - но только для «более доступной» версии, поэтому protected до public, но не, например, public до private. Кстати. на самом деле super версия этого метода protected, @MamoRatzo не изменил его, это нормально

0 голосов
/ 04 марта 2020

Сначала - onCreate() должно быть public, а не protected. Во-вторых, подпись onCreate() не вызывает исключения, поэтому вы не можете добавить его при переопределении. Если вы действительно хотите бросить, то лучшее, что вы можете сделать, это удалить throws из сигнатуры метода, catch его, обернуть его в RuntimeException и повторно выбросить:

try {
  // .. your code
} catch(Exception e){
    throw new RuntimeException(e);
}finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException logOrIgnore) {
                    logOrIgnore.printStackTrace();
                }
            }
        }
...