2015-04-03 11 views
5
public class CheckProg { 
    public int math(int i) { 
     try { 
      int result = i/0; 
     // throw new IOException("in here"); 
     } catch (Exception e) { 
      return 10; 
     } finally { 
      return 11; 
     } 
    } 
    public static void main(String[] args) { 
     CheckProg c1 = new CheckProg(); 
     int res = c1.math(10); 
     System.out.println("Output :" + res); 
    } 

प्रश्न का उपयोग कर जावा में से निपटने: 11अपवाद अंत में

क्यों: यदि मैं ऊपर कोड चलाने के लिए, मैं आउटपुट के रूप में परिणाम प्राप्त? अपवाद को कैच ब्लॉक में पहले पकड़ा नहीं जाना चाहिए और वापस लौटाया जाना चाहिए?

उत्तर

7

कैच ब्लॉक में अपवाद को पहले नहीं पकड़ा जाना चाहिए और वापस लौटाया जाना चाहिए?

यह है पकड़े जाने, और कहा कि वापसी कथन निष्पादित किया जा रहा ... लेकिन फिर वापसी मान को प्रभावी ढंग से finally ब्लॉक में वापसी बयान है, जो निष्पादित करेंगे द्वारा प्रतिस्थापित किया जा रहा है कि क्या है या नहीं एक अपवाद था।

सभी संभावनाओं के विवरण के लिए JLS 14.20.2 देखें। आपके मामले में, इस मार्ग है:

  • तो रन-टाइम:

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

    • कैच ब्लॉक सामान्य रूप से पूरा करता है [... पर ध्यान नहीं दिया, क्योंकि यदि ऐसा नहीं होता] कैच ब्लॉक कारण आर के लिए अचानक पूरा करता है

    • है, तो: तो फिर वहाँ एक विकल्प है अंत में ब्लॉक निष्पादित किया जाता है।

      • अंत में ब्लॉक सामान्य रूप से पूरा करता है [... पर ध्यान नहीं दिया, क्योंकि यदि ऐसा नहीं होता] अंत में ब्लॉक कारण S के लिए अचानक पूरा करता है

      • है, तो: तो फिर वहाँ एक विकल्प है कारण एस के कारण अचानक विवरण पूरा हो गया है (और कारण आर को त्याग दिया गया है)। (हमारे मामले में मूल्य 11 लौटने) "कारण एस" तरीका है कि try बयान अचानक पूरा करता जा रहा समाप्त होता है -

ताकि लब्बोलुआब यह महत्वपूर्ण है ।

+0

कोशिश लेकिन कैसे वापसी कथन आ वापस आता है अंत में ब्लॉक करने के लिए .. –

+3

@kaustubhsinha: एक 'finally' ब्लॉक * हमेशा * कार्यान्वित क्योंकि - कि इसका मुद्दा –

1

हां। लेकिन अंत में ब्लॉक हमेशा बाद में निष्पादित किया जाता है और वापसी मूल्य को ओवरराल करता है!

0

अंत में ब्लॉक निष्पादित हो जाता है कि कोई अपवाद होता है या नहीं।

0

यह बहुत अधिक आत्म-व्याख्यात्मक है। कैच ब्लॉक निष्पादित हो रहा है क्योंकि अपवाद है। अंत में निष्पादन के रूप में निष्पादित किया जाएगा अपवाद के बावजूद गारंटी।

नोट - यदि आपने वापसी के बजाय कुछ अन्य कथन दिए हैं, तो दोनों कथन निष्पादित किए गए हैं। लेकिन वापसी के मामले में, केवल अंतिम वापसी निष्पादित की जा रही है।

} catch (Exception e) { 
       System.out.println("10"); 
      } finally { 
       System.out.println("11"); 
      } 
0

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

{

final int x=100; 
System.out.println("The value of x is"+ x); 

}

catch(Exception e) 
{ 
    System.out.println(e); 
} 
finally 
{ 
    System.out.println("Finally Block executed"); 
} 
संबंधित मुद्दे