2010-08-06 26 views
64

जहाँ तक मैं कह सकता हूं, निम्नलिखित कोड स्निपेट दोनों एक ही उद्देश्य की सेवा करेंगे। finally ब्लॉक क्यों हैं?हम आखिरकार ब्लॉक का उपयोग क्यों करते हैं?

कोड एक:

try { /* Some code */ } 
catch { /* Exception handling code */ } 
finally { /* Cleanup code */ } 

कोड बी:

try { /* Some code */ } 
catch { /* Exception handling code */ } 
// Cleanup code 
+0

यह सी # के लिए विशिष्ट नहीं है। यह एक नेट प्रश्न – Sruly

+1

जावा 7 के साथ और ज़रूरी नहीं है: स्वचालित संसाधन प्रबंधन, कोशिश करें (नया संसाधन डिस्क्लेरियन()) {} –

उत्तर

114
  • क्या होता है यदि आप जिस अपवाद को संभालने वाले नहीं हैं उसे फेंक दिया जाता है? (मुझे उम्मीद है कि आप Throwable नहीं पकड़ रहे हैं ...)
  • यदि आप कोशिश ब्लॉक के अंदर से वापस आते हैं तो क्या होता है?
  • कैच ब्लॉक अपवाद फेंकने पर क्या होता है?

एक finally ब्लॉक सुनिश्चित करें कि तथापि आपको लगता है कि ब्लॉक (पूरी प्रक्रिया को स्पष्ट रूप से निरस्त की कुछ तरीके सापेक्ष), यह निष्पादित हो जाएगा बाहर निकलें बनाता है। संसाधनों के निर्धारक सफाई के लिए यह महत्वपूर्ण है।

+36

जरूरी नहीं है; आखिर में निष्पादित नहीं किया जाएगा यदि (1) वहाँ 'System.exit()' कॉल (2) है या कैच ब्लॉक (3) में एक अनंत लूप है, तो मैं कंप्यूटर पर प्लग खींचता हूं – NullUserException

+1

+1 System.exit() –

+0

हाँ वे आखिरकार वैध रेजोन प्रतीत होते हैं। –

5

अंत में हमेशा मार डाला जाता है, जहां के रूप में पकड़ने के बाद अपने कोड नहीं हो सकता।

+0

क्यों नहीं! अगर अपवाद को सही ढंग से संभाला जाता है तो कोड निश्चित रूप से निष्पादित हो जाएगा। –

+1

@Nadeem: ऐसा होने के 3 कारणों के लिए मेरा उत्तर देखें। –

1

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

0

finally हमेशा निष्पादित करता है, जब तक कि JVM बंद नहीं हो जाता, finally केवल एक ही स्थान पर क्लीनअप कोड डालने का तरीका प्रदान करता है।

यदि आपको catch ब्लॉक में से प्रत्येक में क्लीन अप कोड रखना पड़ा तो यह बहुत कठिन होगा।

0

कई बार जब आप कोड के टुकड़े को निष्पादित करना चाहते हैं तो इससे कोई फर्क नहीं पड़ता। चाहे कोई अपवाद फेंक दिया गया हो या नहीं। फिर कोई finally का उपयोग करता है।

8

ध्यान दें कि (जावा में कम से कम, शायद सी # में भी) यह भी संभव है एक catch के बिना एक try ब्लॉक है, लेकिन एक finally साथ करने के लिए। एक अपवाद try ब्लॉक में होता है, finally ब्लॉक में कोड से पहले अपवाद उच्च फेंक दिया जाता है चलाया जाता है ऊपर:

InputStream in = new FileInputStream("somefile.xyz"); 
try { 
    somethingThatMightThrowAnException(); 
} 
finally { 
    // cleanup here 
    in.close(); 
} 
7

आप कोड है कि आप वैसे भी ध्यान दिए बिना कि क्या होता है की निष्पादित करना चाहते हैं डाल करने के लिए चाहते हो सकता है अपने प्रयास या पकड़ ब्लॉक में।

यदि आप एकाधिक पकड़ का उपयोग कर रहे हैं और यदि आप कुछ पकड़ डालना चाहते हैं जो सभी पकड़ ब्लॉक के लिए आम है तो यह एक जगह होगी- लेकिन आप यह सुनिश्चित नहीं कर सकते कि पूरा कोड प्रयास में निष्पादित किया गया है।

उदाहरण के लिए:

conn c1 = new connection(); 
try { 
    c1.dosomething(); 
} catch (ExceptionA exa) { 
    handleexA(); 
    //c1.close(); 
} catch (ExceptionB exb) { 
    handleexB(); 
    //c1.close(); 
} finally { 
    c1.close(); 
} 
2

हालांकि हमारे आवेदन जबरदस्ती बंद कर दिया है वहाँ कुछ कार्य, है, जो हम पर अमल करना चाहिए (स्मृति रिहाई, बंद करने डेटाबेस, रिलीज ताला, आदि) की तरह यदि आप इन पंक्तियों के बारे में हो जाएगा finally ब्लॉक में कोड का यह निष्पादित करेगा कि कोई अपवाद फेंक दिया गया है या नहीं ...

आपका आवेदन धागे का संग्रह हो सकता है, Exception थ्रेड को समाप्त करता है लेकिन पूरे आवेदन में नहीं, इस मामले में finally अधिक उपयोगी है।

कुछ मामलों finally ऐसे JVM असफल के रूप में निष्पादित नहीं होगा, थ्रेड समाप्त में, आदि

0

कैच ब्लॉक किसी भी अपवाद तो शेष कोड इसलिए मार डाला नहीं होगा हम अंत में ब्लॉक लिखने के लिए है फेंकता है।

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