2011-03-02 2 views
6

처리되지 않은 예외 유형 내가 할 무엇인지 확실하지 않다거나 무엇을 의미하는지 전에이 오류를받은 적이없는 오류

처리되지 않은 예외 유형 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 
} 

"add throws declaration"및 "try/catch with surround"옵션을 제공합니다.

내가해야 할 일과 그 이유는 무엇입니까?

+0

어떤 라인에 표시됩니까? 연락처 조작에 대한 제약 조건을 위반하고 있습니다. – Reno

답변

26

Exception 클래스에서 파생 된 예외에 대해 throws 지시문을 사용하여 호출하는 메서드를 의미합니다. 메서드가 이런 방식으로 선언되면 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); 
    } 
} 

는 지금은 컴파일러에 대해 불평하는 것을 foo에 의해 발생 가능성 Exception 처리했습니다. 처리되었으므로 bar 메서드에 throws 지시문을 추가 할 필요가 없습니다.

+0

대단히 감사합니다. 감사합니다. – tyczj

관련 문제