2010-11-24 41 views
100

इस कोड में someVar सेट किया जाएगा भले ही पकड़ ब्लॉक निष्पादित किया गया हो और दूसरा अपवाद फेंक दिया गया हो?क्या आप अंततः ब्लॉक को चलाते हैं, भले ही आप एक नया अपवाद फेंक दें?

public void someFunction() throws Exception { 
    try { 
     //CODE HERE 
    } catch (Exception e) { 
     Log.e(TAG, "", e); 
     throw new Exception(e); 
    } finally { 
     this.someVar= true; 
    } 
} 
+2

क्योंकि ऐसी परिस्थितियां हैं जहां व्यवहार की अपेक्षा नहीं की जाती है, जैसा कि @GaryF – jax

+1

द्वारा इंगित किया गया है, यह ध्यान देने योग्य है कि अंतिम ब्लॉक निष्पादित नहीं हो सकता है अगर यह अपवाद फेंकता है, या वापसी करता है। –

उत्तर

128

हाँ, अंत में ब्लॉक हमेशा चलाता है ... को छोड़कर जब:

  • धागा चलाने की कोशिश करें-पकड़ने के अंत में ब्लॉक मारे गए या बाधित
  • आप System.exit(0);
  • का उपयोग किया जाता है अंतर्निहित वीएम है किसी अन्य तरीके से नष्ट कर दिया
  • अंतर्निहित हार्डवेयर किसी तरह

इसके अलावा व्यर्थ है सहयोगी, अगर आपके आखिरकार ब्लॉक में एक विधि एक अपरिचित अपवाद फेंकता है, तो इसके बाद कुछ भी निष्पादित नहीं किया जाएगा (यानी। अपवाद फेंक दिया जाएगा क्योंकि यह किसी भी अन्य कोड में होगा)। एक बहुत ही आम मामला जहां यह होता है java.sql.Connection.close() है।

एक तरफ, मैं अनुमान लगा रहा हूं कि आपके द्वारा उपयोग किए गए कोड नमूने केवल एक उदाहरण है, लेकिन आखिरकार ब्लॉक के अंदर वास्तविक तर्क डालने से सावधान रहें। आखिरकार ब्लॉक संसाधन क्लीन-अप (बंद डीबी कनेक्शन, फाइल हैंडल इत्यादि को बंद करने) के लिए है, न कि चलने वाले तर्क के लिए। यदि इसे ट्राइक-कैच ब्लॉक से पहले करना चाहिए, तो किसी अपवाद को फेंकने वाले किसी चीज़ से दूर, क्योंकि आपका इरादा लगभग निश्चित रूप से समान रूप से समान होता है।

+4

विस्तृत सूची के लिए +1 –

+4

आपका क्या मतलब है "थ्रेड-कैच-अंत में ब्लॉक चल रहा थ्रेड [...] बाधित है"? शायद उस दस्तावेज़ीकरण को खराब शब्दों में लिखा गया है, लेकिन Thread.interrupt() अंततः ब्लॉक को छोड़ने का कारण नहीं बनता है, चाहे कोशिश या पकड़ ब्लॉक से फेंक दिया गया हो। क्या यह Thread.stop() की तरह कुछ और हिंसक मतलब है "बाधित" का उपयोग करता है? –

+0

@ जो: हाँ, मुझे लगता है कि डॉक्यूमेंटेशन थोड़ा खराब शब्द है, और इसका मतलब है कि थ्रेड की गतिविधि में सामान्य बाधा है। – GaryF

9

हां।

documentation देखें:

अंत में ब्लॉक हमेशा कार्यान्वित जब कोशिश ब्लॉक बाहर निकलता है।

अपवाद:

नोट: JVM बाहर निकल जाता है, जबकि कोशिश या पकड़ कोड निष्पादित किया जा रहा है, तो अंत में ब्लॉक पर अमल नहीं हो सकता है। इसी प्रकार, यदि निष्पादित करने वाला थ्रेड कोड को आज़माएं या पकड़ें तो बाधित है या मारे गए हैं, अंत में ब्लॉक निष्पादित नहीं हो सकता है, भले ही के रूप में एप्लिकेशन पूरी तरह से जारी रहे।

1

हां। finally ब्लॉक को निष्पादित करता है जब आप System.exit() को कॉल करते हैं, क्योंकि यह जावा VM को रोकता है।

+0

शटडाउन हुक अभी भी System.exit() के बाद बुलाए जाते हैं, लेकिन मौजूदा गैर-सिस्टम थ्रेड सभी बंद हो जाते हैं। –

0

अंत में हमेशा निष्पादित किया जाता है, कोई बात नहीं क्या आप मामले यानी

  • कोशिश पकड़ने के अंत में ब्लॉक
  • फेंकता

अनियंत्रित अपवाद जावा जनादेश नहीं है, त्रुटि हैंडलिंग के लिए है। यह कारण है, यदि आखिर में एक अनचेक अपवाद होता है तो उसमें अवरोध होता है और उसके लिए कोई हैंडलिंग नहीं की जाती है, तो इस बिंदु के नीचे लिखा गया कोड (जहां त्रुटि हुई) निष्पादित नहीं की जाएगी।

तो मैं हमेशा सभी अपवादों को संभालने का सुझाव देता हूं, इसे चेक या अनचेक किया जा सकता है। इस तरह से आप यह सुनिश्चित कर सकते हैं कि अंत में कोड ब्लॉक भी निष्पादित किया गया हो, चाहे कोई भी अनचाहे अपवाद भी न हो। आपके पास उप घोंसले की पकड़ में एक जगह है और आखिर में अपना आवश्यक काम करने के लिए ब्लॉक करें।

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