2011-03-02 24 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 
} 

यह मुझे 2 विकल्प देता है "घोषणा फेंकता है" और "कोशिश/पकड़ के साथ घिरा हुआ"।

मुझे क्या करना है और क्यों?

+0

यह किस लाइन पर फेंक दिया जाता है? आप संपर्क ऑपरेशन पर बाधाओं का उल्लंघन कर रहे हैं। – Reno

उत्तर

26

इसका मतलब है कि आप जिस विधि को बुला रहे हैं उसे Exception कक्षा से प्राप्त अपवाद के लिए throws निर्देश के साथ घोषित किया गया है। जब इस तरह से एक विधि घोषित की जाती है, तो आपको try/catch ब्लॉक का उपयोग करके अपवाद से निपटने के लिए मजबूर होना पड़ता है या अपनी विधि घोषणा के लिए एक समान throws (उसी अपवाद या सुपर प्रकार के लिए) कथन जोड़ना पड़ता है।

एक उदाहरण।

मैं अपनी विधि bar के अंदर कुछ विधि foo पर कॉल करना चाहता हूं।

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

मैं foo कॉल करना चाहते हैं:

यहाँ 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); 
    } 
} 

अब मैं संभावित Exceptionfoo द्वारा फेंका कि संकलक के बारे में शिकायत की गई थी के साथ पेश किया है। चूंकि इसका सामना किया गया है, इसलिए मुझे निर्देश को bar विधि में जोड़ने की आवश्यकता नहीं है।

+0

महान उत्तर धन्यवाद – tyczj

संबंधित मुद्दे