यदि आप एक नया अपवाद फेंकते हैं तो भी आखिरकार क्या चलता है?


142

अगर कोड को someVarनिष्पादित किया जाता है और दूसरा अपवाद फेंका जाता है तो भी इस कोड में सेट किया जाएगा ?

public void someFunction() throws Exception {
    try {
        //CODE HERE
    } catch (Exception e) {
        Log.e(TAG, "", e);
        throw new Exception(e);
    } finally {
        this.someVar= true;
    }
}

2
क्योंकि ऐसी परिस्थितियां हैं जहां व्यवहार अपेक्षा के अनुरूप नहीं है, जैसा कि @GaryF
jax

1
यह ध्यान देने योग्य है कि अंतिम ब्लॉक उम्मीद के मुताबिक निष्पादित नहीं हो सकता है अगर यह एक अपवाद फेंकता है, या वापसी करता है।
पीटर लॉरी

जवाबों:


184

हां, आखिरकार ब्लॉक हमेशा चलता है ... सिवाय कब:

  • ट्राइ-कैच-अंततः ब्लॉक चलाने वाला धागा मारा जाता है या बाधित होता है
  • तुम इस्तेमाल System.exit(0);
  • अंतर्निहित वीएम किसी अन्य तरीके से नष्ट हो जाता है
  • अंतर्निहित हार्डवेयर किसी तरह से अनुपयोगी है

इसके अतिरिक्त, यदि आपके अंतिम ब्लॉक में एक विधि बिना किसी अपवाद को छोड़ती है, तो उसके बाद कुछ भी निष्पादित नहीं किया जाएगा (अर्थात अपवाद किसी अन्य कोड में होगा)। एक बहुत ही सामान्य मामला जहां ऐसा होता है java.sql.Connection.close()

एक तरफ के रूप में, मैं अनुमान लगा रहा हूं कि आपके द्वारा उपयोग किए गए कोड का नमूना केवल एक उदाहरण है, लेकिन वास्तविक तर्क को अंततः ब्लॉक के अंदर रखने से सावधान रहें। अंततः ब्लॉक संसाधन क्लीन-अप (DB कनेक्शन को बंद करना, फ़ाइल हैंडल आदि को जारी करना) के लिए अभिप्रेत है, न कि लॉजिक रन के लिए। यदि यह कोशिश-पकड़ने वाले ब्लॉक से पहले इसे चलाना चाहिए, तो कुछ ऐसा जो एक अपवाद को फेंक सकता है, से दूर, क्योंकि आपका इरादा लगभग निश्चित रूप से समान है।


4
आप यहाँ क्या मतलब है "ट्राइ-कैच-एंड-ब्लॉक चलाने वाला धागा [...] बाधित है"? शायद वह दस्तावेज खराब तरीके से लिखा गया है, लेकिन थ्रेड.इन्टरप्ट () अंत में ब्लॉक होने का कारण नहीं होगा, चाहे वह कोशिश या कैच ब्लॉक से फेंका गया हो। क्या यह "बाधित" का उपयोग थ्रेडस्टॉप () की तरह कुछ और हिंसक करने के लिए करता है?
जो किर्नी

@ जो: हाँ, मुझे लगता है कि दस्तावेज़ थोड़ा खराब शब्द है, और इसका मतलब है कि थ्रेड की गतिविधि के लिए एक सामान्य रुकावट है।
गैरीफ

@ गैरीएफ - मुझे लगता है कि आप जेएलएस से उद्धृत कर रहे हैं। जेएलएस का शब्दांकन कभी-कभी थोड़ा अजीब होता है, लेकिन आप आमतौर पर पाएंगे कि अजीब शब्दावली का अर्थ दस्तावेज़ में कहीं और स्पष्ट रूप से परिभाषित किया गया है। जेएलएस एक विनिर्देश है और इसके प्राथमिक लक्ष्य के रूप में सटीक (पठनीयता के बजाय) है।
स्टीफन C

1
@Stephen C - दरअसल, जो कि JavaSE ट्यूटोरियल (दूसरों द्वारा लिंक किया गया) से आया है। यह JLS में समान रूप से लिखा जा सकता है, लेकिन मैं संबंधित भाग नहीं खोज सकता। मैंने अध्याय 11 (अपवाद), अध्याय 14 (कथन) या अध्याय 15 (एक्सप्रेशंस) में इसकी अपेक्षा की है, लेकिन स्पष्ट रूप से व्यवधानों के संदर्भ में कुछ भी नहीं देख सकता है। मुझे निश्चित रूप से यह देखने में दिलचस्पी होगी।
गैरीफ

1
@ गैरीएफ - मैं देख रहा हूं। वास्तव में JLS "सामान्य" और "अचानक" बयानों को समाप्त करने के बारे में बात करता है, और एक खंड (14.1) है जो शब्दावली को परिभाषित करता है। तब का व्यवहार finallyसामान्य और अचानक समाप्ति के संदर्भ में निर्दिष्ट होता है।
स्टीफन सी

10

हाँ।

प्रलेखन देखें :

अंततः ब्लॉक हमेशा निष्पादित होता है जब कोशिश ब्लॉक से बाहर निकलता है।

अपवाद:

नोट: यदि JVM कोशिश या कैच कोड निष्पादित करते समय बाहर निकलता है, तो अंत में ब्लॉक निष्पादित नहीं हो सकता है। इसी तरह, यदि कोशिश या कैच कोड को निष्पादित करने वाला थ्रेड बाधित होता है या मारा जाता है, तो अंततः ब्लॉक भले ही निष्पादित न हो, लेकिन एप्लिकेशन पूरी तरह से जारी रहता है।


2

अंत में, ब्लॉक हमेशा निष्पादित होता है।

public class ExceptionTest {

public static void someFunction(String input) throws Exception {
    try {
        if( input.equals("ABC") ) {
            System.out.println("Matched");
        }
    } catch (Exception e) {
        throw new Exception(e);
    } finally {
        System.out.println("Input Is "+input+" Finally Executed!!!");
    }
}

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
        System.out.println("********* Test with VALUE ********* ");
        someFunction("ABC");
        System.out.println("\r\n********* Test with NULL  ********* ");
        someFunction(null);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

जावा ट्राई कैच अंत में थ्रो के साथ ब्लॉक करें


2

अंत में हमेशा निष्पादित किया जाता है, कोई फर्क नहीं पड़ता कि आपका मामला क्या है

  • कोशिश-कैच-आखिर ब्लॉक
  • फेंकता

अनियंत्रित अपवादों के लिए, जावा अनिवार्य नहीं है, त्रुटि से निपटने। यही कारण है कि, अगर अंत में ब्लॉक में एक अनियंत्रित अपवाद होता है और उसके लिए कोई हैंडलिंग नहीं की जाती है, तो इस बिंदु के नीचे लिखा कोड (जहां त्रुटि हुई है) निष्पादित नहीं किया जाएगा।

इसलिए मैं सुझाव देता हूं कि सभी अपवादों को हमेशा संभाल कर रखें, यह जाँच या अनियंत्रित हो सकते हैं। इस तरह से आप यह सुनिश्चित कर सकते हैं कि अनियंत्रित अपवाद होने पर भी कोड ब्लॉक अंत में निष्पादित नहीं होता है। आपके पास अपने जरूरी काम को पूरा करने के लिए सब-नेस्ट कैच और अंत में एक जगह है।



1

हाँ। finallyब्लॉक हमेशा निष्पादित करता है सिवाय उस मामले के जिसे आप System.exit () कहते हैं क्योंकि यह जावा VM को रोकता है।


शट डाउन हुक को अभी भी System.exit () के बाद कहा जाता है, लेकिन मौजूदा गैर-सिस्टम थ्रेड्स सभी बंद हैं।
पीटर लॉरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.