दिलचस्प पोस्ट
एंड्रॉइड: .sqlite एक्सटेंशन के साथ संपत्ति फ़ोल्डर एसक्यूलाइट डेटाबेस फ़ाइल तक पहुँचने Android से whatsapp संपर्क कैसे प्राप्त करें? फ़ोन कॉल की अवधि ट्रैक करें सॉर्टेडलिस्ट और सॉर्टेड ऑब्जेक्टरीज़ में अंतर क्या है? जावास्क्रिप्ट से .exe चल रहा है asp.net mvc में एक ड्रॉपडाउन सूची को मान्य करें एक बाइट की सामग्री की पहचान कैसे करें एक जेपीईजी है? Mysqli get_result वैकल्पिक हाइबरनेट के साथ स्प्रिंग सुरक्षा 3 डेटाबेस प्रमाणीकरण जावास्क्रिप्ट – एक पूर्णांक के लिए टेस्ट मैं कैसे जांचूं कि उपयोगकर्ता कुंजी दबा रहा है? पोस्टग्रेस के प्राथमिक कुंजी अनुक्रम को रीसेट कैसे करें जब यह सिंक से बाहर हो जाता है? गतिशील रूप से पंक्तियों को IE में एक <TABLE> में जोड़ नहीं सकते हैं? एंड्रॉइड मीडियाप्लेयर त्रुटि (1, -2147483648) क्या मैं सी # में Outlook (2003/2007) पीएसटी फ़ाइल पढ़ सकता हूं?

गैर-शून्य विधि में रिटर्न विवरण गुम है

मुझे ऐसी स्थिति का सामना करना पड़ा जहां एक गैर-शून्य विधि में एक वापसी का विवरण गुम है और कोड अभी भी संकलित होता है। मुझे पता है कि देर लूप के बाद के बयान (मृत कोड) पहुंचाने योग्य नहीं हैं और कभी भी निष्पादित नहीं किया जाएगा। लेकिन कंपाइलर भी कुछ वापस करने के बारे में क्यों चेतावनी नहीं देता? या क्यों एक भाषा हमें एक अनगिनत पद्धति का उपयोग करने की अनुमति देती है, जिसका अनंत लूप होता है और कुछ भी नहीं लौटाता है?

public int doNotReturnAnything() { while(true) { //do something } //no return statement } 

यदि मैं लूप में एक ब्रेक स्टेटमेंट (एक सशर्त एक भी) जोड़ता हूं, तो कंपाइलर कुख्यात त्रुटियों की शिकायत करता है: 'विधि एक मान नहीं लौटाती' (ईक्लिप्स) और 'सभी कोड पथ एक मान वापस नहीं' (विजुअल स्टूडियो)

 public int doNotReturnAnything() { while(true) { if(mustReturn) break; //do something } //no return statement } 

यह जावा और सी # दोनों के लिए सच है

Solutions Collecting From Web of "गैर-शून्य विधि में रिटर्न विवरण गुम है"

एक भाषा क्यों हमें एक अनगिनत पद्धति का उपयोग करने की अनुमति देती है, जिसका अनंत लूप होता है और कुछ भी नहीं लौटाता है?

गैर-रहित तरीकों के लिए नियम प्रत्येक कोड पथ है जो वापस लौटाने के लिए एक मान वापस कर सकता है , और वह नियम आपके प्रोग्राम में संतुष्ट है: शून्य शून्य शून्य कोड पथ जो मान वापस लौटाते हैं। नियम यह नहीं है कि "हर गैर-शून्य विधि का एक कोड पथ होना चाहिए"।

इससे आपको स्टब-विधियों को लिखने में मदद मिलती है जैसे:

 IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); } 

यह एक गैर-शून्य विधि है इंटरफ़ेस को संतुष्ट करने के लिए इसे गैर-शून्य विधि होना चाहिए। लेकिन यह इस प्रक्रिया को अवैध बनाने के लिए मूर्खतापूर्ण लगता है क्योंकि यह कुछ भी वापस नहीं करता है

कि आपके विधि में एक goto (याद रखना, एक while(true) goto लिखने का एक और सुखद तरीका है) के बजाय एक अप्रत्याशित अंत बिंदु है (जो goto का एक और प्रकार है) प्रासंगिक नहीं है

कंपाइलर भी कुछ वापस करने के बारे में क्यों चेतावनी नहीं देता?

क्योंकि कंपाइलर का कोई अच्छा सबूत नहीं है कि कोड गलत है किसी ने लिखा है while(true) और ऐसा लगता है कि वह व्यक्ति जो जानता था कि वे क्या कर रहे थे।

सी # में पहुंच योग्यता विश्लेषण के बारे में मैं कहां पढ़ सकता हूं?

इस विषय पर मेरे लेख देखें, यहां:

एटीबीजी: वास्तव में और वैध पहुंच योग्यता

और आप सी # विनिर्देश को पढ़ने पर भी विचार कर सकते हैं।

जावा कंपाइलर अप्राप्य कोड (कोड लूप के बाद) खोजने के लिए पर्याप्त स्मार्ट है

और इसकी पहुंच से बाहर होने के बाद, वहाँ एक return बयान जोड़ने में कोई मतलब नहीं है (समाप्त होने के बाद)

एक ही सशर्त के साथ चला जाता है if

 public int get() { if(someBoolean) { return 10; } else { return 5; } // there is no need of say, return 11 here; } 

चूंकि बूलियन स्थिति कुछ बूलियन केवल या तो true या false लिए मूल्यांकन कर सकती है, if-else बाद स्पष्ट रूप से return प्रदान करने की कोई आवश्यकता if-else , क्योंकि यह कोड पहुंच नहीं पा रहा है , और जावा इसके बारे में शिकायत नहीं करता है।

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

यह देखते हुए कि आपका पाश निरंतर पर निष्पादित हो रहा है – संकलक जानता है कि यह एक अनंत लूप है – जिसका अर्थ है कि विधि कभी भी वापस नहीं लौट सकती थी, वैसे भी।

यदि आप एक चर का उपयोग करते हैं – संकलक नियम को लागू करेगा:

यह संकलित नहीं होगा:

 // Define other methods and classes here public int doNotReturnAnything() { var x = true; while(x == true) { //do something } //no return statement - won't compile } 

जावा विनिर्देश एक अवधारणा को परिभाषित करता है जिसे Unreachable statements कहा जाता है। आपको अपने कोड में एक अपठनीय बयान देने की अनुमति नहीं है (यह एक संकलन समय त्रुटि है) आपको (सच) के बाद भी रिटर्न स्टेटमेंट की अनुमति नहीं है; जावा में बयान कुछ while(true); बयान परिभाषा के द्वारा निम्नलिखित बयानों को अप्राप्य बनाता है, इसलिए आपको return स्टेटमेंट की आवश्यकता नहीं है।

ध्यान दें कि समस्या को हल करने के दौरान जेनेरिक मामले में अनिर्णीत नहीं है, अपरिहार्य वक्तव्य की परिभाषा सिर्फ रोकने से अधिक सख्त है। यह बहुत विशिष्ट मामलों का निर्णय ले रहा है जहां एक प्रोग्राम निश्चित रूप से नहीं रोकता है। कंपाइलर सैद्धांतिक रूप से सभी असीम छोरों और अप्राप्य बयानों का पता लगाने में सक्षम नहीं है लेकिन इसे विनिर्देशन में निर्दिष्ट विशिष्ट मामलों का पता लगाना है (उदाहरण के लिए, while(true) केस)

कंपाइलर यह समझने में काफी स्मार्ट है कि आपका लूप अनंत है

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

तो, अपने प्रश्न का उत्तर देने के लिए:

कंपाइलर आपके कोड का विश्लेषण करता है और यह जानने के बाद कि कोई निष्पादन पथ फ़ंक्शन के अंत से गिरने की ओर जाता है जो इसे ठीक से पूरा करता है।

अनंत लूप के वैध कारण हो सकते हैं उदाहरण के लिए बहुत सारे एप्लिकेशन एक अनंत मुख्य लूप का उपयोग करते हैं। एक अन्य उदाहरण एक वेब सर्वर है जो अनुरोधों के लिए अनिश्चित रूप से प्रतीक्षा कर सकता है

कोई ऐसी स्थिति नहीं है जिसमें फ़ंक्शन किसी उचित मान को वापस न ले जाने के अंत तक पहुंच सकता है। इसलिए, कंपाइलर के बारे में शिकायत करने के लिए कुछ भी नहीं है।

प्रकार सिद्धांत में, कुछ नीचे प्रकार कहा जाता है जो कि हर दूसरे प्रकार (!) का उपवर्ग होता है और अन्य चीजों के बीच गैर-समाप्ति का संकेत देने के लिए उपयोग किया जाता है। (अपवाद एक प्रकार की गैर-समाप्ति के रूप में भरोसा कर सकते हैं – आप सामान्य पथ के माध्यम से समाप्त नहीं करते हैं।)

तो एक सैद्धांतिक दृष्टिकोण से, ये बयानों जो बिना समाप्त हो रहे हैं, नीचे की कुछ चीज़ों को वापस करने के लिए माना जा सकता है, जो कि एक प्रकार का अंतर है, इसलिए आप ऐसा करते हैं (प्रकार की) एक प्रकार परिप्रेक्ष्य से सभी के बाद आपकी वापसी मान प्राप्त करते हैं और यह पूरी तरह से ठीक है कि यह कोई मतलब नहीं है कि एक प्रकार इंटेरे सहित सब कुछ का एक उप-वर्ग हो सकता है क्योंकि आप वास्तव में कभी भी वापस नहीं आते हैं

किसी भी मामले में, स्पष्ट प्रकार सिद्धांत या नहीं के माध्यम से, कंपाइलर (संकलक लेखकों) मानते हैं कि एक गैर-टर्मिनेशन बयान के बाद वापसी मूल्य मांगना मूर्खता है: कोई संभावित मामला नहीं है जिसमें आपको उस मूल्य की आवश्यकता हो सकती है (यह अच्छा होगा कि आपका कंपाइलर आपको चेतावनी देता है जब कुछ जानता है कि यह समाप्त नहीं होगा, लेकिन ऐसा लगता है कि आप इसे कुछ वापस करना चाहते हैं। लेकिन यह शैली-जांचकर्ताओं के लिए बेहतर है, क्योंकि आपको टाइप हस्ताक्षर की ज़रूरत है किसी अन्य कारण (उदाहरण के लिए उप-क्लासिंग) के लिए रास्ता है लेकिन आप वास्तव में गैर-समाप्ति करना चाहते हैं।)

दृश्य स्टूडियो में स्मार्ट इंजन है जो पता लगा सकते हैं कि आपने रिटर्न टाइप किया है तो फ़ंक्शन / मेथड में इसके साथ रिटर्न स्टेटमेंट होना चाहिए।

PHP के रूप में यदि आपका कुछ भी वापस नहीं आया है तो आपके रिटर्न का प्रकार सत्य है कंपाइलर 1 मिल गया है, अगर कुछ भी नहीं लौटा है।

इस रूप में

 public int doNotReturnAnything() { while(true) { //do something } //no return statement } 

कंपाइलर को पता है कि वक्तव्य में ही एक अनंतिम प्रकृति है, इसलिए इसे विचार न करें। और पीएचपी कंपाइलर स्वचालित रूप से सच हो जाएगा यदि आप समय की अभिव्यक्ति में एक शर्त लिखते हैं।

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

आपका लूप हमेशा के लिए चलेगा और इसलिए वह बाहर नहीं आएगा; यह निष्पादित करने के लिए जारी रहेगा। इसलिए, जबकि {} के बाहर का भाग पहुंच से बाहर नहीं है और लिखित रूप में नहीं बताया गया है या नहीं। कंपाइलर समझने में काफी बुद्धिमान है कि कौन सा भाग पहुंच योग्य है और कौन सा भाग नहीं है।

उदाहरण:

 public int xyz(){ boolean x=true; while(x==true){ // do something } // no return statement } 

उपरोक्त कोड संकलित नहीं होगा, क्योंकि ऐसा कोई मामला हो सकता है कि चर एक्स के मान को लूप के शरीर के अंदर संशोधित किया जाता है। तो यह लूप पहुंचने के बाहर के हिस्से बनाता है! और इसलिए संकलक 'कोई रिटर्न ब्योरा नहीं मिला' एक त्रुटि फेंक देगा।

संकलक पर्याप्त बुद्धिमान नहीं है (या बल्कि आलसी;)) यह पता लगाने के लिए कि क्या एक्स के मान को संशोधित किया जाएगा या नहीं उम्मीद है कि यह सबकुछ साफ करता है

"कंपाइलर कुछ भी वापस लौटने के बारे में क्यों नहीं चेतावनी देता है? या क्यों कोई भाषा हमें अनगिनत तरीके से एक असीमित विधि होने की अनुमति देती है और कुछ भी नहीं लौट रही है?"

यह कोड अन्य सभी भाषाओं में भी मान्य है (शायद हास्केल को छोड़कर!)। क्योंकि पहली धारणा है कि हम "जानबूझकर" कुछ कोड लिख रहे हैं।

और ऐसी परिस्थितियां हैं जो यह कोड पूरी तरह से वैध हो सकती हैं जैसे कि आप इसे धागे के रूप में उपयोग करने जा रहे हैं; या यदि यह एक Task<int> वापस कर रहा था, तो आप लौटे हुए मूल्य पर आधारित कुछ त्रुटि जांच कर सकते हैं – जो वापस नहीं किया जाना चाहिए।

मैं गलत हो सकता है लेकिन कुछ डीबगर्स चर के संशोधन की अनुमति देते हैं यहां जबकि एक्स कोड द्वारा संशोधित नहीं है और यह जेआईटी द्वारा ऑप्टिमाइज़ किया जाएगा, वह एक्स को गलत में बदल सकता है और विधि को कुछ वापस करना चाहिए (यदि सी # डीबगर द्वारा इस तरह की अनुमति है)

इसके लिए जावा केस की विशिष्टता (जो शायद सी # केस के समान होती है) जावा कम्पाइलर को यह निर्धारित करती है कि कोई विधि वापस करने में सक्षम है या नहीं।

विशेष रूप से, नियम यह होते हैं कि वापसी प्रकार के साथ एक विधि सामान्य रूप से पूर्ण नहीं होनी चाहिए और इसके बजाय प्रत्येक जेएलएस 8.4.7 प्रति अचानक (अचानक यहां रिटर्न स्टेटमेंट या एक अपवाद के माध्यम से इंगित किया जाना चाहिए)

अगर एक विधि को वापसी प्रकार के लिए घोषित किया जाता है, तो एक संकलन-समय त्रुटि तब होती है जब विधि का शरीर सामान्य रूप से पूरा हो सकता है दूसरे शब्दों में, एक वापसी प्रकार के साथ एक विधि को लौटाए जाने वाले वक्तव्य का उपयोग करके ही लौटा देना चाहिए जो मान रिटर्न प्रदान करता है; इसे "अपने शरीर के अंत को दूर करने" की अनुमति नहीं है

कंपाइलर यह देखना चाहता है कि क्या सामान्य समाप्ति संभव है जो जेएलएस 14.21 में वर्णित नियमों के आधार पर संभव नहीं है क्योंकि यह सामान्य पूर्णता के नियमों को भी परिभाषित करता है।

उल्लेखनीय रूप से, अपठनीय बयानों के लिए नियम केवल एक लूप के लिए एक विशेष मामला बनाते हैं, जो कि परिभाषित true निरंतर अभिव्यक्ति है:

एक वक्तव्य सामान्यतया iff पूरा कर सकता है निम्न में से कम से कम एक सत्य है:

  • जबकि वक्तव्य पहुंच योग्य है और स्थिति अभिव्यक्ति निरर्थक अभिव्यक्ति (§15.28) नहीं है, जिसका मूल्य सत्य है।

  • एक पहुंच योग्य बयान है जिसमें वक्तव्य निकलता है।

इसलिए यदि while बयान सामान्य रूप से पूरा हो सकता है, तो नीचे दिए गए एक रिटर्न स्टेटमेंट आवश्यक है क्योंकि कोड को पहुंच योग्य माना जाता है, और किसी भी while तक पहुंचने योग्य बयान या निरंतर true अभिव्यक्ति के बिना किसी भी while लूप को सामान्य रूप से पूरा करने में सक्षम माना जाता है।

इन नियमों का मतलब है कि निरंतर सच्ची अभिव्यक्ति और बिना किसी break आपके वक्तव्य को सामान्य रूप से पूरा करने के लिए कभी नहीं माना जाता है , और इसलिए नीचे दिए गए किसी भी कोड को कभी भी पहुंच योग्य नहीं माना जाता है । विधि का अंत लूप से नीचे है, और क्योंकि लूप से नीचे की सभी चीजें पहुंच से बाहर नहीं हैं, इसलिए विधि का अंत है, और इस प्रकार विधि सामान्य रूप से पूरी तरह से पूरा नहीं हो सकती (जो कि कारीगर की तलाश है)।

if बयान, दूसरी तरफ, उन निरंतर अभिव्यक्तियों के बारे में विशेष छूट नहीं होती है जो लूपों को प्रदान की जाती हैं

की तुलना करें:

 // I have a compiler error! public boolean testReturn() { final boolean condition = true; if (condition) return true; } 

साथ में:

 // I compile just fine! public boolean testReturn() { final boolean condition = true; while (condition) { return true; } } 

भेद का कारण काफी रोचक है, और सशर्त संकलन झंडे की अनुमति देने की इच्छा के कारण है जो कंपलेटर त्रुटियों (जेएलएस से) का कारण नहीं बनता है:

कोई उम्मीद कर सकता है कि अगर बयान निम्नलिखित तरीके से संभाला जाए:

  • यदि-तब वक्तव्य सामान्यतः iff कम कर सकता है निम्न में से कम से कम एक सत्य है:

    • अगर-तब वक्तव्य पहुंच योग्य है और स्थिति अभिव्यक्ति एक स्थिर अभिव्यक्ति नहीं है जिसका मूल्य सही है

    • तब-बयान सामान्य रूप से पूरा कर सकता है

    तब-बयान, अगर अगर-तब वक्तव्य तक पहुंचने योग्य है, तो पहुंच योग्य है और स्थिति अभिव्यक्ति निरंतर अभिव्यक्ति नहीं है जिसका मूल्य झूठा है।

  • अगर-तब-अन्य बयान सामान्य तौर पर पूरा कर सकता है अगर तभी-बयान सामान्य रूप से पूरा कर सकता है या अन्य-बयान सामान्य रूप से पूरा कर सकता है।

    • तत्कालीन-वक्तव्य यदि if-then-else स्टेटमेंट तक पहुंच योग्य है तो पहुंच योग्य है और शर्त अभिव्यक्ति निरंतर अभिव्यक्ति नहीं है जिसका मूल्य झूठा है।

    • अगर-बयान तक पहुंच योग्य है IF-if-else स्टेटमेंट पहुंच योग्य है और शर्त अभिव्यक्ति निरंतर अभिव्यक्ति नहीं है जिसका मान सही है।

यह दृष्टिकोण अन्य नियंत्रण संरचनाओं के उपचार के अनुरूप होगा। हालांकि, "कंडीशनल संकलन" प्रयोजनों के लिए यदि कथनों को आसानी से उपयोग किया जाता है, तो वास्तविक नियम भिन्न होते हैं।

एक उदाहरण के रूप में, निम्नलिखित कथन का संकलन-समय त्रुटि में परिणाम होता है:

while (false) { x=3; } while (false) { x=3; } क्योंकि कथन x=3; पहुंच नहीं है; लेकिन अल्पज्ञात समान रूप से मामला:

if (false) { x=3; } if (false) { x=3; } एक संकलन समय त्रुटि में परिणाम नहीं है एक अनुकूली संकलक को महसूस हो सकता है कि कथन x=3; कभी भी निष्पादित नहीं किया जाएगा और उस कथन के लिए जनरेटेड क्लास फ़ाइल से कोड को छोड़ना चुन सकता है, लेकिन बयान x=3; यहाँ निर्दिष्ट तकनीकी अर्थ में "पहुंच से बाहर" के रूप में नहीं माना जाता है

इस भिन्न व्यवहार के लिए तर्क प्रोग्रामर को "फ्लैग वैरिएबल" को परिभाषित करने की अनुमति देना है जैसे कि:

static final boolean DEBUG = false; और फिर कोड लिखें जैसे:

if (DEBUG) { x=3; } if (DEBUG) { x=3; } विचार यह है कि DEBUG के मूल्य को गलत से सही या गलत से बदलना संभव है और इसके बाद प्रोग्राम पाठ में कोई अन्य परिवर्तन नहीं के साथ कोड को सही ढंग से संकलित करना चाहिए।

कंडीशनल ब्रेक स्टेटमेंट का परिणाम कंपाइलर त्रुटि में क्यों होता है?

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

यदि break पहुंच योग्य है, तो लूप के बाद कोड को एक बार फिर पहुंच योग्य माना जाता है। चूंकि लूप के बाद आकस्मिक समाप्ति का परिणाम नहीं पहुंचने वाला कोड नहीं है, इसलिए विधि को सामान्य रूप से पूरा करने में सक्षम माना जाता है, और इसलिए संकलक उसे एक त्रुटि के रूप में झंडी दिखाते हैं