इसके लिए जावा केस की बारीकियां (जो शायद C # केस से बहुत मिलती-जुलती हैं) के साथ यह करना है कि कैसे जावा कंपाइलर यह निर्धारित करता है कि कोई विधि वापस आने में सक्षम है या नहीं।
विशेष रूप से, नियम यह हैं कि रिटर्न प्रकार के साथ एक विधि सामान्य रूप से पूरी करने में सक्षम नहीं होनी चाहिए और जेएलएस 8.4.7 प्रति के अनुसार अचानक (अचानक यहां वापसी विवरण या अपवाद के माध्यम से इंगित करते हुए) को पूरा करना चाहिए ।
यदि किसी विधि को रिटर्न प्रकार घोषित किया जाता है, तो कंपाइल-टाइम त्रुटि तब होती है जब विधि का शरीर सामान्य रूप से पूरा हो सकता है। दूसरे शब्दों में, रिटर्न प्रकार के साथ एक विधि को केवल रिटर्न स्टेटमेंट का उपयोग करके वापस लौटना चाहिए जो मूल्य वापसी प्रदान करता है; इसे "अपने शरीर के अंत को छोड़ने" की अनुमति नहीं है ।
संकलक यह देखना चाहता है कि क्या जेएलएस 14.21 अनुपलब्ध विवरणों में परिभाषित नियमों के आधार पर सामान्य समाप्ति संभव है क्योंकि यह सामान्य पूर्णता के नियमों को भी परिभाषित करता है।
उल्लेखनीय रूप से, अप्राप्य कथनों के नियम एक विशेष मामले को केवल उन छोरों के लिए बनाते हैं जिनकी एक परिभाषित true
स्थिर अभिव्यक्ति है:
एक बयान में सामान्य रूप से पूरा हो सकता है यदि निम्न में से कम से कम एक सच है:
इसलिए यदि 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;
}
}
भेद का कारण काफी दिलचस्प है, और सशर्त संकलन झंडे की अनुमति देने की इच्छा के कारण है जो कंपाइलर त्रुटियों (जेएलएस से) का कारण नहीं है:
यदि निम्नलिखित कथन को निम्नलिखित तरीके से संभाला जाए, तो कोई उम्मीद कर सकता है:
एक if-then स्टेटमेंट सामान्य रूप से iff को पूरा कर सकता है यदि निम्न में से कम से कम एक सत्य है:
तत्कालीन कथन पुन: प्राप्य है यदि if-तत्कालीन कथन उपलब्ध है और स्थिति अभिव्यक्ति स्थिर अभिव्यक्ति नहीं है जिसका मान गलत है।
एक if-then-else स्टेटमेंट सामान्य रूप से पूरा कर सकता है iff- स्टेटमेंट सामान्य रूप से पूरा कर सकता है या अन्य स्टेटमेंट सामान्य रूप से पूरा कर सकता है।
तत्कालीन कथन पुन: प्राप्य है यदि if-if-अन्यथा कथन उपलब्ध है और स्थिति अभिव्यक्ति स्थिर अभिव्यक्ति नहीं है जिसका मान गलत है।
इफ-स्टेटमेंट इफ-वाचिंग इफ-इफ-इफ-इयर्न स्टेटमेंट उपलब्ध है और कंडीशन एक्सप्रेशन एक स्थिर एक्सप्रेशन नहीं है जिसका मान सत्य है
यह दृष्टिकोण अन्य नियंत्रण संरचनाओं के उपचार के अनुरूप होगा। हालाँकि, यदि कथन को "सशर्त संकलन" उद्देश्यों के लिए सुविधाजनक रूप से उपयोग करने की अनुमति देने के लिए, वास्तविक नियम भिन्न हैं।
एक उदाहरण के रूप में, निम्नलिखित कथन एक संकलन-समय त्रुटि का परिणाम देता है:
while (false) { x=3; }
क्योंकि कथन उपलब्ध x=3;
नहीं है; लेकिन सतही रूप से समान मामला:
if (false) { x=3; }
संकलन-समय त्रुटि में परिणाम नहीं करता है। एक अनुकूलन करने वाले कंपाइलर को यह महसूस हो सकता है कि स्टेटमेंट x=3;
कभी निष्पादित नहीं होगा और उत्पन्न क्लास फाइल से उस स्टेटमेंट के लिए कोड को छोड़ना चुन सकता है, लेकिन स्टेटमेंटx=3;
यहाँ निर्दिष्ट तकनीकी अर्थों में को "अगम्य" नहीं माना जाता है।
इस भिन्न उपचार का औचित्य प्रोग्रामर्स को "ध्वज चर" को परिभाषित करने की अनुमति देना है:
static final boolean DEBUG = false;
और फिर कोड लिखें जैसे:
if (DEBUG) { x=3; }
विचार यह है कि DEBUG के मूल्य को असत्य से सत्य में या असत्य से असत्य में बदलना संभव है और फिर कोड को प्रोग्राम टेक्स्ट में कोई अन्य परिवर्तन न करके सही ढंग से संकलित करना चाहिए।
एक संकलक त्रुटि के कारण सशर्त ब्रेक स्टेटमेंट क्यों होता है?
जैसा कि लूप रीचबिलिटी नियमों में उद्धृत किया गया है, एक लूप भी सामान्य रूप से पूरा हो सकता है यदि इसमें एक पहुंच योग्य ब्रेक स्टेटमेंट हो। एक की गम्यता के लिए नियमों के बाद से if
बयान की तो खंड नहीं की हालत लेते if
बिल्कुल ध्यान में, इस तरह के एक सशर्त if
बयान है तो खंड हमेशा पहुंच योग्य माना जाता है।
यदि break
पहुंच योग्य है, तो लूप के बाद का कोड एक बार फिर से पहुंच योग्य माना जाता है। चूंकि कोई भी पहुंच योग्य कोड नहीं है जिसके परिणामस्वरूप लूप के बाद अचानक समाप्ति होती है, फिर विधि को सामान्य रूप से पूरा करने में सक्षम माना जाता है, और इसलिए संकलक इसे एक त्रुटि के रूप में चिह्नित करता है।