ошибка типа необработанного исключения - PullRequest
7 голосов
/ 02 марта 2011

Я никогда не получал эту ошибку раньше, поэтому я не уверен, что делать или что это значит

Необработанный тип исключения OperationApplicationException

Это происходит в этомкод:

public void putSettings(SharedPreferences pref){
    ArrayList<ContentProviderOperation> ops =
          new ArrayList<ContentProviderOperation>();

    ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
    .withSelection(Data.RAW_CONTACT_ID + "=?", new String[]{String.valueOf(pref.getString(SmsPrefs.ID, ""))})
    .withValue(Data.MIMETYPE,"vnd.android.cursor.item/color")
    .withValue("data1",nColor).build());
    getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); //error


    ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
    .withSelection(Data.RAW_CONTACT_ID + "=?", new String[]{String.valueOf(pref.getString(SmsPrefs.ID, ""))})
    .withValue(Data.MIMETYPE,"vnd.android.cursor.item/vibrate")
    .withValue("data1", nVibrate).build());
    getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); //error

    ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
    .withSelection(Data.RAW_CONTACT_ID + "=?", new String[]{String.valueOf(pref.getString(SmsPrefs.ID, ""))})
    .withValue(Data.MIMETYPE, "vnd.android.cursor.item/sound")
    .withValue("data1", ringTonePath).build());
    getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);//error
}

Это дает мне 2 варианта "добавить объявление бросков" и "окружить при помощи попытки / поймать".

Что мне делать и почему?

1 Ответ

28 голосов
/ 02 марта 2011

Это означает, что вызываемый вами метод объявлен с директивой throws для исключения, полученного из класса Exception.Когда метод объявляется таким образом, вы вынуждены обрабатывать исключение, используя блок try/catch, или добавляете идентичный оператор throws (для того же исключения или супертипа) в объявление метода.

Пример.

Я хочу вызвать некоторый метод foo внутри моего метода bar.

Вот определение foo:

public static void foo(String a) throws Exception {
    // foo does something interesting here.
}

Я хочу позвонить foo.Если я просто сделаю это:

private void bar() {
    foo("test");
}

... тогда я получу ошибку, с которой вы столкнулись.foo объявляет миру, что действительно может решить бросить Exception, и вам лучше быть готовым с этим справиться.

У меня есть два варианта.Я могу изменить определение bar следующим образом:

private void bar() throws Exception {
    foo("test");
}

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

Часто лучше иметь дело с исключением самостоятельно, если можете.Это подводит нас ко второму варианту, try/catch:

private void bar() {
    try {
        foo("test");
    } catch(Exception e) {
        Log.wtf("MyApp", "Something went wrong with foo!", e);
    }
}

Теперь я имел дело с потенциалом Exception, генерируемым foo, на который жаловался компилятор.Поскольку это уже решено, мне не нужно добавлять директиву throws в мой метод bar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...