2012-01-14 10 views
29

निम्न विधि में, संकलक के बारे में शिकायत करता है कि गुम हो गया है, भले ही केवल एक ही रास्ता है विधि, और इसमें return कथन शामिल है। त्रुटि को दबाने के लिए एक और return कथन की आवश्यकता है।कंपाइलर "लापता वापसी कथन" के बारे में शिकायत करता है, भले ही वापसी की स्थिति में कमी आती है, जहां वापसी का विवरण गुम हो जाएगा

public int foo() { 
    if (true) { 
     return 5; 
    } 
} 

यह देखते हुए कि Java compiler can recognize infinite loops, कारण है कि यह इस स्थिति से निपटने नहीं करता है और साथ ही? जुड़ा हुआ सवाल संकेत देता है, लेकिन इस विशिष्ट मामले के लिए विवरण प्रदान नहीं करता है।

+2

'foo4()' में संकलक इतना चालाक नहीं है कि यह समझता है कि फ़ंक्शन हमेशा 5 लौटाता है। यह सिर्फ जांचता है कि सभी कोड पथ कुछ वापस नहीं करते हैं। –

+1

यदि कथन का विशेष रूप से प्रवाह विश्लेषण में इलाज किया जाता है, तो जेएलएस 14.21 देखें: * यदि कथन, ... असामान्य तरीके से संभाला जाता है। इस कारण से, इस खंड के अंत में अलग-अलग चर्चा की जाती है * – irreputable

+0

@irreputable भविष्य में, यदि आप एक प्रश्न बंद करने पर विवाद करना चाहते हैं, तो मॉडरेटर समीक्षा के लिए पोस्ट को फ़्लैग करने या [मेटा] पर पोस्ट करने पर विचार करें। यह अपमानजनक लोगों या पदों को बर्बाद करने के आसपास चलने से कहीं अधिक रचनात्मक है। –

उत्तर

12

JLS 14.21, Unreachable Statements अनुभाग है कि इस से संबंधित है:

अगर बयान, चाहे या नहीं यह एक बाकी हिस्सा है, एक असामान्य ढंग से नियंत्रित किया जाता है। इस कारण से, इस खंड के अंत में अलग से चर्चा की जाती है।

आखिरकार यह करना है कि सशर्त संकलन कैसे किया जाता है। इस विधि पर विचार करें:

public int foo() { 
    if (DEBUG) { 
     return 5; 
    } 
} 

तो DEBUG है static final boolean true; आप सोच सकते हैं संकलक बहुत चालाक विधि हमेशा 5 वापस आ जाएगी साकार करने के लिए होना चाहिए। लेकिन अगर यह false में बदल गया है, तो कोड अब मान्य नहीं है।

विधि एक स्रोत कोड परिवर्तन बिना विधि के माध्यम से सभी रास्ते के लिए मान्य होना चाहिए, के अनुकूलन compilers ध्वज के मूल्य की परवाह किए बिना स्रोत संशोधनों के बिना बाईटकोड छोड़ करने की इजाजत दी।

very end of the linked JLS section महत्वपूर्ण विवरण में जाता है।

+0

+1 जेएलएस संदर्भ। – paislee

+0

@ डेव न्यूटन: कृपया दूसरा यूआरएल अपडेट करें (लिंक किए गए जेएलएस सेक्शन का बहुत अंत) –

+0

@ नंदकुमार इसे अपडेट करें? –

5

कारण है कि संकलक शिकायत कर रहा है, Section 14.21 of the Java Language Specification से इस महत्वपूर्ण बिंदु के साथ क्या करना है नहीं पहुंचा जा सकता बयान पर चर्चा:

while, do की विशेष उपचार के अलावा, और for बयान जिसका हालत अभिव्यक्ति निरंतर है मूल्य true, अभिव्यक्ति के मूल्य प्रवाह विश्लेषण में ध्यान में नहीं रखा जाता है।

ध्यान दें कि ifनहीं बयान true लगातार स्थिति का विशेष हैंडलिंग है में से एक है। इस विशेष हैंडलिंग से इसे बाहर करने का कारण if को सशर्त संकलन के रूप में उपयोग करने की अनुमति देना है, क्योंकि डेव न्यूटन ने अपने जवाब में बताया।

+0

अच्छा बिंदु अभी तक मैंने @ डेव न्यूटन के जवाब को स्वीकार कर लिया क्योंकि वह पहले से ही अच्छी चीजों का उल्लेख करता है। आपका बहुत बहुत धन्यवाद। – Lion

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