未处理的异常类型错误

时间:2011-03-02 01:51:28

标签: java android unhandled-exception

我之前从未犯过这个错误所以我不知道该做什么或意味着什么

  

未处理的异常类型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个选项“添加抛出声明”和“使用try / catch环绕”。

我该怎么办?为什么?

1 个答案:

答案 0 :(得分:28)

这意味着您正在调用的方法使用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指令。