7

以前にこのエラーが発生したことがないため、何をすべきか、またはそれが何を意味するのかわかりません

未処理の例外の種類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
}

「スロー宣言を追加する」と「try / catchで囲む」という2つのオプションがあります。

私は何をしなければならないのですか?

4

1 に答える 1

30

これは、呼び出しているメソッドが、クラス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、対処する準備ができていることを世界に宣言します。

選択肢は 2 つあります。barの定義を次のように変更できます。

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

Exceptionこれで、自分のメソッドまたは呼び出すメソッドが、自分のメソッドのユーザーが対処する必要のある をスローする可能性があるという、自分自身の警告を公開しました。メソッドの呼び出し元に責任を委ねたので、メソッドは例外自体を処理する必要はありません。

可能であれば、例外を自分で処理することをお勧めします。これにより、2 番目のオプションであるtry/catch:

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

これで、コンパイラが不平を言っていることExceptionによってスローされる可能性に対処しました。foo対処済みなので、メソッドにthrowsディレクティブを追加する必要はありません。bar

于 2011-03-02T02:03:55.277 に答える