2010-12-30 26 views
92

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

+2

[कोशिश अंत में और कोशिश-पकड़ के बीच अंतर] (http://stackoverflow.com/questions/2854910/difference-between-try-finally-and-try-catch) –

+22

के संभावित डुप्लिकेट @ एमपी हर किसी को कोड समीक्षा करनी चाहिए और उनसे प्रश्न पूछना चाहिए कि कैसे सीखना और सुधार करना है। –

उत्तर

97

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

आखिरकार ब्लॉक हमेशा निष्पादित होता है, चाहे कोई अपवाद फेंक दिया गया हो या नहीं।

+8

पहला पैराग्राफ जरूरी नहीं है। कोशिश करें ब्लॉक को घोंसला जा सकता है। कोई भी अपवाद अपवाद, अनचेक या नहीं, विधि से बाहर बुलबुला होगा। –

+4

ब्लॉक को नेस्टेड किया जा सकता है, लेकिन मैं इसकी अनुशंसा नहीं करता। मैं इस तरह से कोड नहीं लिखता। – duffymo

+1

@ डफिमो: "विधि से बाहर बुलबुले" का क्या अर्थ है? – todayILearned

1

क्या आप इस कार्यक्रम के साथ प्रयास नहीं करते हैं? आखिरकार अंत में ब्लॉक को ब्लॉक और निष्पादित कर दिया जाएगा, लेकिन अपवाद को संभाला नहीं जाएगा। लेकिन, आखिरकार ब्लॉक में उस अपवाद को खारिज कर दिया जा सकता है!

2

अगर यह एक अपवाद या कुछ भी फेंकने योग्य

अपवाद किसी भी अन्य मामले में जहां यह पकड़ा नहीं कर रहा है के रूप में, ब्लॉक से बाहर फेंक दिया जाता है का सामना करना पड़ता कैसे कोशिश ब्लॉक काम करता है।

अंत में ब्लॉक कैसे कोशिश ब्लॉक से बाहर निकल गया है की परवाह किए बिना निष्पादित किया जाता है - क्या कोई कैच बिल्कुल कर रहे हैं, कि क्या वहाँ कोई मिलता-जुलता पकड़ है की परवाह किए बिना परवाह किए बिना कि।

पकड़ ब्लॉक और आखिरकार कोशिश ब्लॉक के ऑर्थोगोनल हिस्सों हैं। आप या तो दोनों हो सकते हैं। जावा 7 के साथ, आप न तो हो पाएंगे!

4

आखिरकार ब्लॉक हमेशा प्रयास समाप्त होने के बाद चलाया जाता है, चाहे अपवाद, एर, फेंकने योग्य होने के कारण सामान्य या असामान्य रूप से समाप्त हो जाए।

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

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

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

उदा। -

r = new LeakyThing(); 
try { useResource(r); } 
finally { r.release(); } // close, destroy, etc 

"अंत में", एक और टिप: यदि आप कर एक पकड़ने में डालने के लिए परेशान है, या तो पकड़ विशिष्ट (उम्मीद) फेंकने योग्य उपवर्गों, या सिर्फ "फेंकने योग्य", को पकड़ने के नहीं "अपवाद" , एक सामान्य पकड़-सभी त्रुटि जाल के लिए।इस तरह के प्रतिबिंब goofs के रूप में भी कई समस्याओं,, "त्रुटियां", बल्कि "अपवाद" से फेंक, और उन किसी भी "सभी पकड़ने" कोडित द्वारा सही पर्ची जाएगा के रूप में:

catch (Exception e) ... // doesn't really catch *all*, eh? 

इस बजाय कार्य करें:

catch (Throwable t) ... 
+0

बदसूरत हिस्से के लिए नीचे कार्लोस हेबरर द्वारा उत्तर देखें। –

1

आखिरकार ब्लॉक को पूरा करने के बाद ब्लॉक को निष्पादित किया जाता है। अगर कोशिश ब्लॉक के अंदर कुछ फेंक दिया जाता है तो आखिरकार ब्लॉक को छोड़ दिया जाता है।

77

try/finally पर एक छोटा सा ध्यान दें: अंत में हमेशा निष्पादित करेंगे जब तक

  • System.exit() कहा जाता है।
  • जेवीएम दुर्घटनाग्रस्त हो जाता है।
  • try{} ब्लॉक कभी समाप्त नहीं होता है (उदा। अंतहीन पाश)।
+2

'try {..} पकड़ें {throw ..} अंत में {..}' के बारे में क्या? मुझे लगता है कि आखिर में – sbeliakov

+8

निष्पादित नहीं किया जाएगा, उस स्थिति में अंततः अभी भी बुलाया जाएगा। केवल मूल अपवाद खो गया है। –

+0

अंत में यदि आप System.exit() को पहले कॉल करते हैं तो भी निष्पादित नहीं किया जाएगा। –

30

जावा भाषा विशिष्टता (1) का वर्णन करता है try-catch-finally कैसे क्रियान्वित किया जाता है। कोई पकड़ नहीं होने के कारण दिए गए थ्रोबल को पकड़ने में सक्षम पकड़ने के बराबर नहीं है।

  • कोशिश ब्लॉक के निष्पादन एक मूल्य के वी के थ्रो की वजह से अचानक पूरा करता है, तो वहाँ एक विकल्प है:
    • तो वी के रन-टाइम प्रकार के पैरामीटर के लिए आबंटित है कोशिश बयान के किसी भी पकड़ खंड, फिर ...
      ...
    • तो वी के रन-टाइम प्रकार कोशिश बयान के किसी भी पकड़ खंड के पैरामीटर के लिए आबंटित नहीं है, तो अंत में ब्लॉक निष्पादित किया जाता है।
      • अंत में ब्लॉक सामान्य रूप से पूरा करता है, तो कोशिश बयान मूल्य वी
      • हैं की एक फेंक अंत में ब्लॉक कारण S के लिए अचानक पूरा करता है, तो कोशिश बयान की वजह से अचानक पूरा करता है: तो फिर वहाँ एक विकल्प है कारण एस के लिए अचानक समाप्त होता है (और मूल्य वी का फेंक त्याग दिया जाता है और भूल जाता है)।

(1) Execution of try-catch-finally

12

भीतरी अंत से पहले बाहरी ब्लॉक करने के लिए अपवाद फेंक करने के लिए मार डाला जाता है। संस्करण 7 से पहले

A 
B 
X 
Y 
Z 
3

जावा संस्करणों में

public class TryCatchFinally { 

    public static void main(String[] args) throws Exception { 

    try{ 
     System.out.println('A'); 
     try{ 
      System.out.println('B'); 
      throw new Exception("threw exception in B"); 
     } 
     finally 
     { 
      System.out.println('X'); 
     } 
     //any code here in the first try block 
     //is unreachable if an exception occurs in the second try block 
    } 
    catch(Exception e) 
    { 
     System.out.println('Y'); 
    } 
    finally 
    { 
     System.out.println('Z'); 
    } 
    } 
} 

परिणाम कोशिश पकड़ने के अंत में इन तीन संयोजन के लिए अनुमति देते हैं ...

try - catch 
try - catch - finally 
try - finally 

finally ब्लॉक हमेशा क्या try या/और catch ब्लॉक में हो रहा है की कोई बात नहीं है निष्पादित किया जाएगा। इसलिए यदि catch ब्लॉक नहीं है, तो अपवाद यहां संभाला नहीं जाएगा।

हालांकि, आपको अभी भी अपने कोड में अपवाद हैंडलर की आवश्यकता होगी - जब तक कि आप अपना आवेदन पूरी तरह से क्रैश नहीं करना चाहते। यह आपके आवेदन की आर्किटेक्चर पर निर्भर करता है जहां वह हैंडलर है।

  • जावा कोशिश ब्लॉक या तो पकड़ द्वारा पालन किया जाना चाहिए या अंत में ब्लॉक।
  • प्रत्येक प्रयास ब्लॉक के लिए शून्य या अधिक पकड़ ब्लॉक हो सकते हैं, लेकिन केवल एक अंत में अवरुद्ध हो सकता है।
  • अंत में ब्लॉक निष्पादित नहीं किया जाएगा यदि प्रोग्राम बाहर निकलता है (या तो System.exit() को कॉल करके या घातक त्रुटि उत्पन्न करने से प्रक्रिया को समाप्त करने का कारण बनता है)।
+1

"संस्करण 7 अनुमति से पहले" क्या आप यह कह रहे हैं कि जावा 7 और जावा 8 इन तीन संयोजनों की अनुमति नहीं देते हैं? मुझे संदेह है कि आपका मतलब क्या है, लेकिन यही आपके उत्तर का तात्पर्य है। – Aaron

+0

आखिरकार ब्लॉक को निष्पादित किया गया है यदि कोशिश ब्लॉक में वापसी विवरण है? – Rahul

+0

@ राहुल हां, आखिरकार बुलाया जाएगा। रेफरी: http://stackoverflow.com/questions/65035/does-finally-always-execute-in-java – roottraveller

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