Избегайте пробовать / ловить на Android - PullRequest
6 голосов
/ 01 января 2011

Я новичок в среде Android и начал писать код для выполнения некоторых запросов к базе данных. Когда мне приходится обрабатывать исключения, я не знаю, как правильно это сделать - из Android я использовал декларацию throws для методов, но кажется, что throws не разрешено в Android? Просто try-catch? Я говорю это, потому что eclipse не предлагает мне добавлять объявление throws, как, например, когда я не в среде Android, я думаю, что оно связано с extends Activity. Итак, как правильно обрабатывать исключения в Android? Окружение каждого предложения try-catch делает мой код ужасным, и это не совсем то, что я хочу делать.

Ответы [ 3 ]

13 голосов
/ 02 января 2011

Если используемый вами метод уже генерирует исключение, вы можете просто перебросить исключение как новый тип:

public void someMethod() throws IOException {
    try {
        //  Do database operation
    } catch (MyException e){
        throw new IOException(e.toString());
    }
}

//  Or, if there is no exception, use an unchecked exception:

public void otherMethod() {
    try {
        // DB operation
    } catch (MyException e){
        throw new RuntimeException(e);
    }
}

Другой вариант - сделать MyException продление RuntimeException. Тогда компилятор не заставит вас перехватить его или добавить в сигнатуру метода. RuntimeExceptions известны как непроверенные исключения , означающие, что вам не нужно проверять их на предмет попытки / перехвата. Примеры этого NullPointer и ArrayOutOfBounds.

4 голосов
/ 24 января 2012

Мне просто было интересно узнать о какой-то странной обработке «бросков» в среде Android, и я нашел этот старый вопрос здесь. Аскер Джон"начал писать код для выполнения некоторых запросов к базе данных", поэтому, возможно, он заметил то же самое, что и я.

Компилируется без ошибок:

public void onCreate(SQLiteDatabase db)
{
    db.execSQL(DbMeta.T_DISGUISED.T_CREATE);
}

Несмотря на это объявление (во всплывающем окне javadoc):

void android.database.sqlite.SQLiteDatabase.execSQL(String sql) throws SQLException

Итак, во-первых, monkjack прав, когда указывает, что сигнатура метода onCreate не может быть изменена путем наследования реализаций. А во-вторых, Zeki правильно указывает на разницу между отмеченными и непроверенными исключениями.

А теперь, в-третьих, я хочу добавить, что большая путаница вызвана SQLException.

SQLException, используемый в приведенном выше примере, является типом Android android.database.SQLException и наследует java.lang.RuntimeException - это непроверенное исключение! Не требуется декларация бросков !!!

Это не классический java.sql.SQLException - это java.lang.Exception и требует try / catch / throws.

2 голосов
/ 02 января 2011

Причина, по которой вы не можете «добавить броски в Android через Eclipse», заключается в том, что вы не тот человек, который определяет интерфейсы или суперклассы. Если вы хотите добавить исключение в сигнатуру метода (как вы говорите, вы делаете это нормально), его также необходимо добавить в интерфейс, и вы не управляете им, поэтому вы не можете его изменить.

Например, метод

защищенный void onCreate (Bundle saveInstanceState);

, который вы переопределяете в активности, если вы хотите вызвать исключение, подпись метода должна быть изменена на (например)

Защищенный void onCreate (Bundle saveInstanceState) создает MyException;

но тогда также потребуется изменить место определения onCreate, которое находится в классе Activity - и это класс, который нельзя изменить (поскольку он предоставляется библиотекой android).

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

catch (Exception e) {
  Toast toast = Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT);
  toast.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...