java - संकलक त्रुटि के बिना कई रिटर्न स्टेटमेंट




compiler-errors return (6)

(संक्षिप्त उत्तर के लिए- उत्तर के बोल्ड और इटैलिक भागों को पढ़ें)

जावा 8 डॉक्स के अनुसार निष्पादन प्रवाह। यह आपको विवरण प्रदान करता है। आप निम्न के आधार पर रिटर्न स्टेटमेंट का निष्पादन कर सकते हैं।

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

फिर एक विकल्प है:

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

- यदि अंत में ब्लॉक सामान्य रूप से पूरा होता है, तो कोशिश स्टेटमेंट सामान्य रूप से पूरा होता है।

- यदि अंत में कारण S के लिए अचानक पूरा हो जाता है, तो कोशिश का बयान अचानक कारण S से पूरा होता है।

यदि मान V के एक थ्रो के कारण ट्राई ब्लॉक का निष्पादन अचानक पूरा हो जाता है, तो एक विकल्प है:

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

फिर एक विकल्प है:

> यदि कैच ब्लॉक सामान्य रूप से पूरा होता है, तो अंत में ब्लॉक निष्पादित होता है। फिर एक विकल्प है:

»यदि अंततः ब्लॉक सामान्य रूप से पूरा होता है, तो कोशिश स्टेटमेंट सामान्य रूप से पूरा होता है।

»यदि अंत में किसी कारण से अचानक ब्लॉक पूरा हो जाता है, तो कोशिश स्टेटमेंट उसी कारण से अचानक पूरा हो जाता है।

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

»यदि अंत में ब्लॉक सामान्य रूप से पूरा हो जाता है, तो प्रयास विवरण आर के लिए अचानक पूरा हो जाता है।

» यदि अंत में कारण S के लिए अचानक पूरा हो जाता है, तो कोशिश कथन S (और कारण R को त्याग दिया जाता है) के लिए अचानक पूरा हो जाता है।

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

फिर एक विकल्प है:

> यदि अंत में ब्लॉक सामान्य रूप से पूरा हो जाता है, तो मान वी के एक थ्रो के कारण प्रयास विवरण अचानक पूरा हो जाता है।

> यदि अंत में कारण S के लिए अचानक पूरा हो जाता है, तो S का कारण के लिए अचानक प्रयास पूरा हो जाता है (और मान V का फेंकना छोड़ दिया जाता है और भुला दिया जाता है)।

• यदि किसी अन्य कारण R के लिए ट्राई ब्लॉक का निष्पादन अचानक समाप्त हो जाता है, तो अंत में ब्लॉक निष्पादित होता है, और फिर एक विकल्प होता है:

- यदि अंत में ब्लॉक सामान्य रूप से पूरा हो जाता है, तो प्रयास विवरण आर के लिए अचानक पूरा हो जाता है।

- यदि अंत में कारण S के लिए अचानक पूरा हो जाता है, तो S (और कारण R को छोड़ दिया जाता है) के लिए प्रयास विवरण अचानक पूरा हो जाता है।

इस कड़ी में स्पष्टीकरण स्पष्ट है- javaDoc

यह एक साक्षात्कार प्रश्न था:

public class Demo {

    public static void main(String[] args) {
        System.out.println(foo());
    }

    static String foo() {
        try {
            return "try ...";
        } catch (Exception e) {
            return "catch ...";
        } finally {
            return "finally ..."; //got as result
        }
    }
}

मेरा सवाल यह है कि कोई संकलन समय त्रुटियाँ क्यों हैं। जब मेरे finally ब्लॉक में रिटर्न स्टेटमेंट होता है, तो यह try और ब्लॉक catch बजाय finally से लौटने के लिए बाध्य होता है। मैंने -Xlint विकल्प के साथ इस कोड को संकलित करने की कोशिश की, यह एक चेतावनी देता है।

warning: [finally] finally clause cannot complete normally

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


केवल 1 के बाद से कोई संकलन समय त्रुटि नहीं है और return स्टेटमेंट के ठीक 1 वास्तव में कॉलिंग कोड पर नियंत्रण वापस कर देगा।

जैसा कि समझाया गया है @ हप्जे, try भीतर return या पकड़ें सबसे पहले निष्पादित होंगे, उनके संबंधित रिटर्न स्टेटमेंट भी निष्पादित करेंगे। लेकिन कॉलिंग कोड पर नियंत्रण वापस करने से ठीक पहले, यह finally ब्लॉक को निष्पादित करेगा। अब, यह block भी कुछ return है, इसलिए यह रिटर्न पिछले वाले को ओवरराइड करता है।


यह अनिवार्य रूप से इस प्रकार है:

public boolean someMethod(){
        if(1 == 1){
            return true;
        }
        return false;
}

यह एक संकलन त्रुटि नहीं देगा, हालांकि यह एक चेतावनी देगा। कंपाइलर केवल एक त्रुटि देगा जब कोई रिटर्न स्टेटमेंट निष्पादित होने का मौका है।


यह जावा भाषा विशिष्टता में वर्णित है:

§14.17

एक finally क्लॉज के अचानक पूरा होने पर return स्टेटमेंट द्वारा शुरू किए गए नियंत्रण के हस्तांतरण को बाधित कर सकता है।

§14.20.2

यदि try ब्लॉक का निष्पादन सामान्य रूप से पूरा होता है, तो finally ब्लॉक निष्पादित किया जाता है, और फिर एक विकल्प होता है:

  • यदि finally ब्लॉक सामान्य रूप से पूरा होता है, तो try स्टेटमेंट सामान्य रूप से पूरा होता है।
  • यदि finally ब्लॉक कारण S के लिए अचानक पूरा हो जाता है, तो try कथन एस के कारण अचानक पूरा हो जाता है।

यदि आर ब्लॉक का निष्पादन किसी अन्य कारण R के लिए अचानक पूरा हो जाता है, तो finally ब्लॉक निष्पादित होता है, और फिर एक विकल्प होता है:

  • यदि finally ब्लॉक सामान्य रूप से पूरा हो जाता है, तो try विवरण आर के लिए अचानक पूरा हो जाता है।
  • यदि finally कारण S के लिए अचानक पूरा हो जाता है, तो S (और कारण R को छोड़ दिया जाता है) के लिए try विवरण अचानक पूरा हो जाता है।

शानदार सवाल .. मेरी जानकारी के अनुसार अगर आपने अपने कोड में आखिरकार ब्लॉक जोड़ दिया है, तो ट्राइ और ब्लॉक को पकड़ने के विवरण को अंत में ट्रांसफर कर दिया जाता है। उसका काम कैसा है।

तो इस मामले में सभी कोड लाइनें निष्पादित हो रही हैं और आप डीबगिंग का प्रयास कर सकते हैं। सभी तीन ब्लॉकों मैंने नीचे दिए गए कोड की कोशिश की।

public class Main {

    public static void main(String[] args) {
        System.out.println(foo());
    }
    static String foo() {
        try {
            throw new Exception();
        } catch (Exception e) {
            return "catch ...";
        } finally {
            return "finally ..."; //got as result
        }
    }
}

आप नीचे दिए गए लिंक से विचार प्राप्त कर सकते हैं। एकाधिक रिटर्न: कौन सा अंतिम रिटर्न मूल्य निर्धारित करता है?





try-catch-finally