java जावा पकड़ने की कोशिश करें अंत में पकड़ के बिना ब्लॉक




try-catch finally (8)

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


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

try - catch
try - catch - finally
try - finally

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

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

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

try / finally एक छोटा सा नोट: आखिरकार हमेशा तक निष्पादित नहीं होगा

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

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

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

(1) अंततः कोशिश-पकड़ का निष्पादन


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

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

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

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

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

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

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

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

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

catch ( Throwable t) ...

प्रयास को अवरुद्ध करने का प्रयास कैसे किया जाता है यदि यह किसी अपवाद या कुछ भी फेंकने योग्य होता है

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

आखिरकार ब्लॉक को निष्पादित किया जाता है कि कैसे प्रयास ब्लॉक बाहर निकलता है - भले ही कोई कैच न हो, भले ही कोई मिलान पकड़ हो।

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


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


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


बाहरी ब्लॉक को अपवाद फेंकने से पहले आंतरिक अंततः निष्पादित किया जाता है।

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');
    }
  }
}

का परिणाम

A
B
X
Y
Z




try-finally