2010-07-28 28 views
36

का उपयोग कैसे करें I अंत में कथन के उपयोग को कभी भी समझ में नहीं आया। किसी को भी मुझे बता सकते हैं क्या अंतर के बीच है: एक हाथ परअंततः

try { 
    a; 
    block; 
    off; 
    statements; 
} catch (Exception e) { 
    handle; 
    exception; 
    e; 
} finally { 
    do; 
    some; 
    cleanup; 
} 

और:

try { 
    a; 
    block; 
    off; 
    statements; 
} catch (Exception e) { 
    handle; 
    exception; 
    e; 
} 
do; 
some; 
cleanup; 

अन्य

उत्तर

35

वे अलग करता है, तो

  • try -block एक java.lang.Throwable कि एक java.lang.Exception नहीं है फेंक, उदाहरण के लिए, क्योंकि यह एक java.lang.Error ऐसे AssertionError या OutOfMemoryError के रूप में है से पूरा करती है।
  • कोशिश ब्लॉक अचानक एक नियंत्रण प्रवाह विवरण इस तरह के एक continue, break या return
  • पकड़ने ब्लॉक अचानक पूरा करता है का उपयोग कर पूरा करता है (किसी भी फेंकने योग्य फेंक, या एक नियंत्रण प्रवाह विवरण का उपयोग करके)

अधिक आम तौर पर, जावा भाषा गारंटी देता है कि कोशिश-बयान पूरा होने से पहले आखिरकार ब्लॉक को निष्पादित किया जाता है। (ध्यान दें कि यदि कोशिश-कथन पूरा नहीं होता है, तो अंत में कोई गारंटी नहीं है। हार्डवेयर शट डाउन, ओएस शट डाउन, वीएम शटडाउन (उदाहरण के लिए System.exit के कारण) के लिए कई कारणों से एक कथन पूरा नहीं हो सकता है, थ्रेड इंतज़ार कर (Thread.suspend(), synchronized, Object.wait(), Thread.sleep()) या अन्यथा व्यस्त होने के (अनंत छोरों, ,,,)।

तो, एक finally ब्लॉक विधि शरीर के अंत की तुलना में सफाई कार्यों के लिए एक बेहतर जगह है, लेकिन अपने आप में, अभी भी सफाई अपर्याप्तता की गारंटी नहीं दे सकता है।

7

पर उचित कोडिंग शैली में आप एक पकड़ करने के लिए नहीं करना चाहते हैं सब नीचे के रूप में।

try{ 
    [some task] 
} 
catch 
{ 
} 

आप जो करना चाहते हैं वह विशिष्ट ज्ञात त्रुटियों को पकड़ना है।

try{ 
    [some task] 
} 
catch(Exception ex) 
{ 
    if([known execption]) 
    [ignore] 
    else 
    throw(ex); 
} 
[Cleanup] 

इस मामले में अपनी सफाई कोड एक त्रुटि के मामले में नहीं चलाया जाएगा फिर से फेंक दिया जा रहा है। इसलिए हम आखिर में जोड़ देंगे जो एक नई त्रुटि फेंकने के बावजूद दौड़ जाएगी।

try{ 
    [some task] 
} 
catch(Exception ex) 
{ 
    if([known execption]) 
    [ignore] 
    else 
    throw(ex); 
} 
finally 
{ 
    [Cleanup] 
} 
27

finally ब्लॉक हमेशा निष्पादित करता है।

finally ब्लॉक, की तरह मुक्त try/catch के भीतर इस्तेमाल संसाधन, करीब db कनेक्शन, करीब सॉकेट, आदि के लिए .. सफाई के लिए इस्तेमाल किया अपने try/catch ब्लॉक के भीतर एक बिना क्रिया अपवाद तब होता है, जब भी कर रहा है।

केवल समय finally ब्लॉक निष्पादित नहीं करता है जब system.exit()try/catch में कहा जाता है या कुछ त्रुटि एक अपवाद के बजाय होता है।

ऊपर दिए गए विवरण में त्रुटि का अर्थ है जब जावा एप्लिकेशन आउट ऑफ़ मेमोरी त्रुटि जैसी स्थितियों से बाहर निकलता है। मुझे कुछ डाउनवॉट्स दिखाई देते हैं :(इस कारण से ऐसा लगता है।

+2

सुधार: आखिरकार ब्लॉक _is_ निष्पादित किया गया जब java.lang.Error फेंक दिया जाता है। यह सफलतापूर्वक निष्पादित नहीं हो सकता है, लेकिन यह निष्पादित करता है। इसके अलावा, अतिरिक्त con अंततः ब्लॉक के निष्पादन को विफल कर सकते हैं, एक अपूर्ण सूची के लिए मेरा जवाब देखें। – meriton

+0

नोट: यदि कोशिश या पकड़ कोड निष्पादित किया जा रहा है, तो JVM बाहर निकलता है, तो आखिरकार ब्लॉक निष्पादित नहीं हो सकता है। इसी प्रकार, यदि कोशिश या पकड़ कोड निष्पादित करने वाला थ्रेड बाधित या मारे गए हैं, तो आखिर में ब्लॉक जारी नहीं हो सकता है, भले ही एप्लिकेशन पूरी तरह से जारी रहे। - https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html – Hansa

18

मुख्य अंतर यह है कि catch अनुभाग स्वयं को अपवाद फेंक सकता है, आसपास के ब्लॉक से बाहर हो सकता है, या वर्तमान विधि से वापस आ सकता है। उस स्थिति में do; some; cleanup; नहीं है । निष्पादित

एक finally ब्लॉक के साथ, यह गारंटी कि कि कोड निष्पादित किया जाएगा है

+0

अंत में निष्पादित होने की गारंटी है? http://stackoverflow.com/questions/464098/does-a-finally-block-always-run –

+0

हां, System.exit() के मामले में नहीं, यह सच है। या, आप जानते हैं, एक JVM क्रैश। – Dan

+2

... या एक डेडलॉक, या ... - वास्तविक नियम यह है: अंततः ब्लॉक को निष्पादित करने की गारंटी है जब/प्रयास करें- (पकड़) - अंतिम रूप से कथन पूरा हो जाता है। – meriton

10

यह मूल रूप से एक बुरा विचार सभी अपवादों को पकड़ने के लिए है -। तो आप पर विचार करना है कि क्या होगा की जरूरत है न आया हुआ अपवाद propagates अपने प्रयास/पकड़ से बाहर या कोशिश/पकड़/आखिरकार ब्लॉक। अंत में ब्लॉक आपको अनुमति देते हैं आप रास्ते पर साफ करने के लिए।

इसके अलावा

:

  • कैच ब्लॉक एक अपवाद फेंक सकती है
  • आप कोशिश ब्लॉक

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

7

"आखिरकार" ब्लॉक हमेशा निष्पादित होगा।

आपके दूसरे उदाहरण में, कैच ब्लॉक अपवाद को पुनर्स्थापित करता है, या यदि प्रयास ब्लॉक में कोई अपवाद अपवाद नहीं हुआ है तो क्लीनअप नहीं होगा।

+0

ऐसी कई स्थितियां हैं जहां आखिरकार निष्पादित नहीं किया गया है (सी.एफ. मेरा जवाब), लेकिन आप सही हैं कि अपवाद फेंकना (या नियंत्रण प्रवाह विवरणों का उपयोग करना) उनमें से नहीं हैं। – meriton

3

GeekInterview पर this मंच से:

अंत में हमेशा ब्लॉक निष्पादित करता है जब कोशिश ब्लॉक बाहर निकलता है। यह सुनिश्चित करता है कि अंततः ब्लॉक निष्पादित किया जाता है भले ही एक अप्रत्याशित अपवाद होता है। लेकिन अंततः अपवाद हैंडलिंग से अधिक के लिए उपयोगी है - यह प्रोग्रामर को रिटर्न, जारी रखने या ब्रेक द्वारा गलती से क्लीनअप कोड रखने से बचने की अनुमति देता है। अंत में ब्लॉक में क्लीनअप कोड रखना हमेशा एक अच्छा अभ्यास है, भले ही कोई अपवाद नहीं है।

1

सीधे शब्दों में व्याख्या की एक पंक्ति:

परवाह किए बिना कि क्या आप एक अपवाद है या नहीं पकड़ा, finally ब्लॉक में कोड निष्पादित कर दिया जाएगा।

आपके द्वारा यहां दिए गए दो टुकड़ों के बीच अंतर यह है: finally का उपयोग किये बिना टुकड़े में कोड कभी निष्पादित नहीं होंगे।

finally को ठीक से समझने के लिए, आपको यह जानने की आवश्यकता है कि finally = गारंटी!

आप को साफ करने, डब्ल्यू/उपयोगकर्ता मित्रता मदद करने के लिए या कुछ और पुन: प्रयास करने

0

पहले उदाहरण में उपयोग कर सकते हैं अंत में हमेशा ब्लॉक निष्पादित हो जाता है, भले ही आप कोशिश खंड में एक वापसी कथन है। जब आपके पास System.exit (0) है तो केवल एक बार निष्पादित नहीं किया जाता है।

+0

ऐसी कई अन्य स्थितियां हैं जहां आखिरकार निष्पादित नहीं किया गया है, सी.एफ. मेरा जवाब (जो उन सभी को देने का दावा नहीं करता ...) – meriton

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