【问题标题】:unhandled exception type error未处理的异常类型错误
【发布时间】:2017-01-26 02:54:10
【问题描述】:

我以前从未遇到过这个错误,所以我不确定该怎么做或这意味着什么

未处理的异常类型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 包围”。

我必须做什么以及为什么?

【问题讨论】:

  • 这是在哪一行抛出的?你违反了接触操作的限制。

标签: java android unhandled-exception


【解决方案1】:

这意味着您正在调用的方法是使用throws 指令声明的,用于从Exception 类派生的异常。当以这种方式声明方法时,您必须使用 try/catch 块来处理异常,或者在方法声明中添加相同的 throws(针对相同的异常或超类型)语句。

一个例子。

我想在我的方法bar中调用一些方法foo

这是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);
    }
}

现在我已经处理了编译器抱怨的foo 引发的潜在Exception。既然已经处理好了,我就不需要在我的bar 方法中添加throws 指令了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多