Избегайте попыток / уловки на Android

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

Solutions Collecting From Web of "Избегайте попыток / уловки на Android"

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

 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 известны как непроверенные исключения, означающие, что вам не нужно проверять их на наличие попытки try / catch. Примерами являются NullPointer и ArrayOutOfBounds .

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

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

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

Несмотря на это объявление (в javadoc popup):

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

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

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

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

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

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

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

Protected void onCreate (Bundle savedInstanceState);

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

Protected void onCreate (Bundle savedInstanceState) бросает MyException;

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

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

 catch (Exception e) { Toast toast = Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT); toast.show(); }