2011-01-17 24 views
8
static int retIntExc() throws Exception{ 
    int result = 1; 
    try { 
     result = 2; 
     throw new IOException("Exception rised."); 
    } catch (ArrayIndexOutOfBoundsException e) { 
     System.out.println(e.getMessage()); 
     result = 3; 
    } finally { 
     return result; 
    } 
} 

मेरा एक मित्र एक .NET डेवलपर है और वर्तमान में जावा में माइग्रेट कर रहा है और वह मुझे इस स्रोत के बारे में निम्नलिखित प्रश्न पूछता है। सिद्धांत में यह throw IOException("Exception rised.") होना चाहिए और पूरी विधि retIntExc()throws Exception होना चाहिए। लेकिन कुछ नहीं होता है, विधि 2 लौटती है।अंततः

मैंने अपने उदाहरण का परीक्षण नहीं किया है, लेकिन मुझे लगता है कि यह अपेक्षित व्यवहार नहीं है।

संपादित करें: सभी उत्तरों के लिए धन्यवाद। आप में से कुछ ने इस तथ्य को अनदेखा कर दिया है कि विधि को retIntExc कहा जाता है, जिसका अर्थ है कि यह केवल कुछ परीक्षण/प्रयोगात्मक उदाहरण है, जो यांत्रिकी को फेंकने/पकड़ने में समस्या दिखा रहा है। मुझे 'फिक्स' की आवश्यकता नहीं थी, मुझे स्पष्टीकरण की आवश्यकता क्यों हुई।

+0

आप इसे 'IOException' फेंक क्यों नहीं देते? – BoltClock

+0

http://stackoverflow.com/questions/65035/in-java-does-return-trump-finally –

उत्तर

16

वापस आ जाएगी यह वह जगह है, तो आपको क्यों अंत में में ब्लॉक सी # :)

यह पूरी तरह व्यवहार में बाहर रखी है से वापस नहीं लौट सकते हालांकि जावा भाषा विशिष्टता। यह section 14.20.2 में निर्दिष्ट है।

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

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

बोली ऊपर बुलेट बिंदुओं के इस नेस्टेड सेट से था, विकल्प जो यहाँ लागू नहीं हैं बाहर छोड़ने:

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

धन्यवाद। यही मुझे जरूरी है - जेएलएस संदर्भ। – fiction

3

यह वापसी 2 क्योंकि

finally हमेशा

+0

-1 ** आखिर में हमेशा निष्पादित नहीं होता ** और यह कुछ भी प्रिंट नहीं करता है। – Ishtar

+0

कृपया इसे आज़माएं। Println (retIntExc()); और कुछ भी मतदान करने से पहले कृपया सोचो! –

+0

अंत में वास्तव में हमेशा निष्पादित नहीं होता है। – Woot4Moo

2

finally ब्लॉक निष्पादित करता निष्पादित कोई बात नहीं क्या अपवाद फेंक दिया है होगा। आपके द्वारा घोषित catch ब्लॉक द्वारा अपवादों को पकड़ा जाने के बाद यह निष्पादित नहीं होता है। यह try ब्लॉक के बाद निष्पादित करता है और पर अपवाद पकड़े जाते हैं। यदि आपकी विधि अपवाद फेंकता है, तो यह तब तक कुछ भी वापस नहीं कर सकता जब तक कि आप इसे अपनी विधि में निगल न दें और result वापस न करें। लेकिन आप दोनों नहीं हो सकता है।

इसके अलावा, जब तक कि आपके विधि में कोई अन्य कोड न हो, ArrayIndexOutOfBoundsException कभी भी सामना नहीं किया जाएगा।

0

IOException वर्ग ArrayIndexOutOfBoundsException वर्ग के एक बच्चे को तो पकड़ हिस्सा कभी नहीं निष्पादित किया जाएगा नहीं है।

आप इसे करने के बदलते हैं, तो यह यह 3.

static int retIntExc() throws Exception{ 
     int result = 1; 
     try { 
      result = 2; 
      throw new ArrayIndexOutOfBoundsException ("Exception rised."); 
     } catch (ArrayIndexOutOfBoundsException e) { 
      System.out.println(e.getMessage()); 
      result = 3; 
     } finally { 
      return result; 
     } 
    } 
2

इसका कारण यह है कि आप एक वापसी कथन से पहले अपवाद गर्त पारित हो जाता है और इस तरह एक मान्य मान दिया जाता है जारी करते हैं। आप दोनों एक मूल्य वापस नहीं कर सकते हैं और अपवाद फेंक सकते हैं।

वापसी के आसपास अंत में ब्लॉक को हटाने से आप जो व्यवहार चाहते हैं उसे दे देंगे।

0

मुझे नहीं पता कि यह व्यवहार की अपेक्षा क्यों नहीं की जाएगी। इस कोड को ब्लॉक परिणाम के अंत तक 2.

static int retIntExc() throws Exception{ 
     int result = 1; 
     try { 
      result = 2; 

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

 throw new IOException("Exception rised."); 
    } catch (ArrayIndexOutOfBoundsException e) { 
      ... 
    } 

अंत में ब्लॉक, निष्पादित होने की गारंटी तो अंतिम चरण 2.

यह सफल वापसी उत्साह से भरा हुआ अपवाद राजनीति पर हावी वापस जाने के लिए है। यदि आप अपवाद को बुलबुला जारी रखना चाहते हैं तो आपको अंत में ब्लॉक में वापस नहीं जाना चाहिए।

0

return डालने के अंत में विधि में आप अपवाद को ओवरराइड करते हैं और परिणाम बदले में वापस आ जाता है। आपका कोड इस तरह कुछ होना चाहिए:

static int retIntExc() throws Exception{ 
     int result = 1; 
     try { 
      result = 2; 
      throw new IOException("Exception rised."); 
     } catch (ArrayIndexOutOfBoundsException e) { 
      System.out.println(e.getMessage()); 
      result = 3; 
     } finally { 
      // do something 
     } 
     // it gets here only when exception is not thrown 
     return result; 
    } 
संबंधित मुद्दे