क्या Java में finally हमेशा चलता है? कोड के साथ पूर्ण विश्लेषण

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Java में finally ब्लॉक: मिथक, सच्चाई और छिपे खतरे

\n\n

हर Java डेवलपर, चाहे वह शुरुआती हो या सीनियर, कभी न कभी finally ब्लॉक का सामना करता है। किताबों में लिखा होता है: "यह ब्लॉक हमेशा चलता है, चाहे एक्सेप्शन आए या नहीं।" यह एक पक्की गारंटी लगती है, है ना? लेकिन आइए पर्दे के पीछे झांकते हैं।

\n\n

StackOverflow पर "Does a finally block always get executed in Java?" सवाल को हज़ारों बार देखा गया है और सैकड़ों टिप्पणियाँ मिली हैं। अनुभवी प्रोग्रामर बहस करते हैं, शुरुआती भ्रमित होते हैं, और असली कोडिंग के मामले बताते हैं: "हमेशा" कोई पूर्ण सत्य नहीं है। इस लेख में हम सभी परिदृश्यों को समझेंगे, असली कोड लिखेंगे और जानेंगे कि finally कब आपको निराश कर सकता है।

\n\n

finally कैसे काम करता है? बुनियादी उदाहरण

\n\n

शुरुआत क्लासिक उदाहरण से करते हैं। finally ब्लॉक का उपयोग रिसोर्सेज को फ्री करने के लिए किया जाता है: फ़ाइलें बंद करना, डेटाबेस कनेक्शन, सॉकेट आदि। यह try (और catch, अगर एक्सेप्शन आया हो) के बाद चलता है, लेकिन मेथड से कंट्रोल बाहर जाने से पहले।

\n\n
public class FinallyDemo {\n    public static void main(String[] args) {\n        try {\n            System.out.println("try के अंदर");\n            int result = 10 / 2; // सब ठीक\n        } catch (ArithmeticException e) {\n            System.out.println("एक्सेप्शन पकड़ा गया: " + e.getMessage());\n        } finally {\n            System.out.println("finally ब्लॉक चल गया!");\n        }\n        System.out.println("प्रोग्राम जारी है...");\n    }\n}
\n\n

आउटपुट:

\n
try के अंदर\nfinally ब्लॉक चल गया!\nप्रोग्राम जारी है...
\n\n

सब कुछ अनुमानित है। लेकिन क्या होगा अगर try में कोई एक्सेप्शन आए जो पकड़ा न जाए?

\n\n
public class FinallyWithUncaught {\n    public static void main(String[] args) {\n        try {\n            System.out.println("शून्य से भाग देने की कोशिश...");\n            int result = 10 / 0; // एक्सेप्शन!\n        } finally {\n            System.out.println("Finally एक्सेप्शन के ऊपर जाने से पहले चलता है");\n        }\n        // यह लाइन नहीं चलेगी\n        System.out.println("यह लाइन प्रिंट नहीं होगी");\n    }\n}
\n\n

आउटपुट शुरुआती लोगों को हैरान करेगा:

\n
शून्य से भाग देने की कोशिश...\nFinally एक्सेप्शन के ऊपर जाने से पहले चलता है\nException in thread "main" java.lang.ArithmeticException: / by zero\n    at FinallyWithUncaught.main(FinallyWithUncaught.java:5)
\n\n

finally ब्लॉक चल गया, भले ही एक्सेप्शन हैंडल नहीं हुआ। इसी व्यवहार ने "हमेशा" का मिथक पैदा किया। लेकिन अब गहराई में चलते हैं।

\n\n

finally कब नहीं चलता? असली परिदृश्य

\n\n

कम से कम तीन स्थितियाँ हैं जब finally नहीं चल सकता। इन्हें याद रखें — यह आपके डिबगिंग के घंटे बचाएगा।

\n\n

1. System.exit() — JVM का आपातकालीन समापन

\n\n

सबसे मशहूर मामला। अगर try ब्लॉक में System.exit(0) कॉल किया जाए, तो JVM तुरंत बंद हो जाता है, और finally नहीं चलेगा।

\n\n
public class FinallyAndExit {\n    public static void main(String[] args) {\n        try {\n            System.out.println("काम शुरू कर रहे हैं...");\n            System.exit(0); // JVM यहीं खत्म होता है\n        } finally {\n            // यह कोड नहीं चलेगा!\n            System.out.println("आपने सोचा मैं चलूंगा? नहीं चलूंगा!");\n        }\n    }\n}
\n\n

आउटपुट:

\n
काम शुरू कर रहे हैं...
\n\n

ऐसा क्यों? क्योंकि System.exit() वर्चुअल मशीन को OS स्तर पर रोक देता है। यह कोई एक्सेप्शन नहीं है — यह "मर जाने" का आदेश है। finally ब्लॉक के पास चलने का समय ही नहीं होता।

\n\n
\n महत्वपूर्ण: अगर आप कोड में System.exit() का उपयोग कर रहे हैं, तो इसे बंद करें। यह बुरी आदत है। प्रोग्राम को खत्म करने के लिए

ब्लॉग

पुस्तक अनुशंसाएँ