2011-04-18 15 views
60

कृपया निम्नलिखित कोड देखें और आउटपुट व्यवहार की व्याख्या करें।कैच में वापसी कथन का व्यवहार और अंत में

public class MyFinalTest { 

    public int doMethod(){ 
     try{ 
      throw new Exception(); 
     } 
     catch(Exception ex){ 
      return 5; 
     } 
     finally{ 
      return 10; 
     } 
    } 

    public static void main(String[] args) { 

     MyFinalTest testEx = new MyFinalTest(); 
     int rVal = testEx.doMethod(); 
     System.out.println("The return Val : "+rVal); 
    } 

} 

परिणाम वापसी वैल है: 10

ग्रहण एक चेतावनी दिखाता है: finally block does not complete normally

कैच ब्लॉक में रिटर्न स्टेटमेंट का क्या होता है?

+0

के संभावित डुप्लीकेट के रूप में वापस आ जाएगी [क्यों में एक अंत में वापसी मान नहीं बदल ब्लॉक लौटे चर बदल रहा है?] (http://stackoverflow.com/questions/ 16030858/क्यों-बदले-बदले-परिवर्तनीय-इन-ए-एंड-ब्लॉक-न-चेंज-द-रिटर्न) – fglez

+2

एक बहुत ही लोकप्रिय साक्षात्कार प्रश्न। –

उत्तर

67

यह finally में से एक द्वारा ओवरराइड किया गया है, क्योंकि finally अन्य सभी के बाद निष्पादित किया गया है।

यही कारण है कि अंगूठे का नियम - कभी भी finally से वापस नहीं आते। ग्रहण, उदाहरण के लिए, उस स्निपेट के लिए चेतावनियां दिखाता है: "आखिरकार ब्लॉक सामान्य रूप से पूरा नहीं होता है"

49

finally हमेशा निष्पादित होता है (केवल अपवाद System.exit() है)। आप इस व्यवहार के इस तरह से लगता है कि कर सकते हैं:

  1. एक अपवाद उत्पन्न कर रहा है
  2. अपवाद पकड़ा है और वापसी मान 5 के लिए सेट है
  3. अंत में ब्लॉक निष्पादित हो जाता है और वापसी मान 10
  4. पर सेट है फ़ंक्शन
+0

कोशिश/पकड़ ब्लॉक के सामान्य नियम: 1) अंत में ब्लॉक में कभी भी मूल्य वापस न करें। 2) अंत में एक अपवाद फेंकने से बचें या काले रंग को पकड़ें, क्योंकि यह मूल अपवाद को अस्पष्ट करता है। – Matt

+12

अंततः हमेशा निष्पादित किया जाता है यह एक बहुत ही खतरनाक चीज है। आप मिशन महत्वपूर्ण संचालन के लिए इसे निष्पादित करने पर भरोसा नहीं कर सकते हैं। बिजली की आबादी, जेवीएम भ्रष्टाचार/दुर्घटना, आदि जैसे कुछ पर विचार करें। मुझे पता है कि यह थोड़ा नाइट-पिक्य लगता है, लेकिन हमेशा एक मजबूत शब्द है, और मुझे लगता है कि कभी-कभी हम भूल जाते हैं कि हम असली दुनिया में रहते हैं जहां ऐसा आपदाएं होती हैं पाए जाते हैं। – corsiKa

3

finally ब्लॉक हमेशा निष्पादित किया जाता है (यदि मिलान कोशिश मार डाला गया था) तो इससे पहले कि विधि catch ब्लॉक में के रूप में वापस 5, यहकार्यान्वितब्लॉक और रिटर्न 10.

17

यदि आप वीएम के निम्न स्तर के लेआउट को याद करते हैं तो यह एक आसान सवाल है।

  1. वापसी मूल्य कैच कोड द्वारा ढेर लगाया जाता है।
  2. बाद में, अंत में कोड निष्पादित किया जाता है और स्टैक पर मान को ओवरराइट करता है।
  3. फिर, विधि कॉलर द्वारा उपयोग किए जाने वाले सबसे अद्यतित मूल्य (10) के साथ वापस आती है।

यदि इस तरह की चीजों के बारे में अनिश्चित है, तो अंतर्निहित प्रणाली (अंत में असेंबलर स्तर पर जाकर) की समझ में वापस आना।

(funny sidenote)

0

अंत में अनुभाग हमेशा निष्पादित करेंगे निष्पादित। जैसे अगर आपके पास रिलीज करने के लिए कोई चीज है, या चीज की तरह लॉग आउट करें, अगर त्रुटि होती है तो कैच सेक्शन पर जाएं और आखिरकार निष्पादित हो जाएगा।

Session session // opened some session 
try 
{ 
// some error 
} 
catch { log.error } 
finally 
{ session.logout();} 

इसे किसी भी चीज़ को वापस करने के लिए उपयोग नहीं किया जाना चाहिए। आप के बाहर उपयोग कर सकते हैं।

3

enter image description here

अंत में हमेशा जब तक System.exit() बयान अंत में ब्लॉक का पहला सदस्य है निष्पादित हो ब्लॉक।

तो यहां उपर्युक्त उदाहरण में निष्कर्ष को कथन कथन द्वारा फेंक दिया गया है और पकड़ ब्लॉक में पकड़ लिया जाता है। वैल्यू के साथ रिटर्न स्टेटमेंट है, इसलिए स्टैक कॉल वैल्यू अंततः ब्लॉक को निष्पादित करते समय स्टैक के शीर्ष पर जोड़ा जाता है और स्टैक व्यवहार "स्टस्ट व्यवहार के अनुसार नवीनतम मूल्य स्टैक लौटाता है पहले बाहर में " इसलिए यह मूल्य 10.

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