2014-06-12 6 views
5

जब अनंत लूप के बाद लिखा गया कुछ कथन है, तो वह कथन पहुंच योग्य कोड बन जाता है। पूर्व के लिए:जावा में "पहुंचने योग्य कोड" स्थिति कब होती है?

for(;;) 
{ 
} 
Sytem.out.println("Test-1"); //unreachable code 

लेकिन मुझे यहां कुछ कठिनाई का सामना करना पड़ रहा है। नीचे दो कोड स्निपेट पर

देखो:

कोड snippet1:

for(final int z=4;z<6;) 
{ 
} 
System.out.println("Test-2"); //unreachable code 

इधर, पिछले बयान नहीं पहुंचा जा सकता होना चाहिए, क्योंकि पाश अनंत है और उत्पादन की उम्मीद है के रूप में।

कोड Snippet2:

final int z=4; 
for(;;) 
{ 
    if(z<2) 
     break; 
} 
System.out.println("Test-3"); //not unreachable 

वैचारिक रूप से, ऊपर कोड में पाश के लिए भी अनंत है के बाद से z अंतिम है और if(z<2) संकलन समय only.The पर निर्धारित किया जाता है, तो हालत सच कभी नहीं होगा और पाश कभी नहीं होगा टूटना। लेकिन, उपरोक्त कोड में अंतिम विवरण पहुंच योग्य नहीं है।

सवाल:

  1. क्यों हो रहा है?

  2. क्या कोई मुझे सटीक नियम बता सकता है जिसके द्वारा हम देख सकते हैं कि कोड पहुंच योग्य नहीं है या नहीं।

+7

जावा भाषा विशिष्टता का उत्तर है: [पहुंचने योग्य वक्तव्य] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21) – Christian

+2

@ गिननाड, आप केवल z = 2 तोड़ें, जो यह नहीं है। (प्रश्न बदल दिया गया हो सकता है) – Holloway

उत्तर

3

कुंजी वाक्यांश http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21 में है:

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

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

इसलिए संकलक अपने if() बयान में z<2 का मूल्यांकन नहीं है, और कि यह true का मूल्यांकन कभी नहीं होगा पता नहीं है।

यह जावा स्पेक के संबंध में पहुंचने योग्य कोड को परिभाषित करता है। यह महत्वपूर्ण है कि कंपाइलर्स spec का पालन करें, क्योंकि नियमों को बदलना संकलन करने में असफल संकलन करने के लिए उपयोग किया गया कोड बना सकता है।

हालांकि, संकलन संकलन त्रुटियों के बजाय चेतावनी देने के लिए स्वतंत्र हैं।

अगर मैं ग्रहण में निम्न कोड टाइप करें:

final int x = 0; 
if(x == 1) { 
    System.out.println("This never happens"); 
} 

... मैं चेतावनी "डेड कोड" मिलता है। संकलक जानता है कि कोड तक नहीं पहुंचा जा सकता है - लेकिन यह संकलित करने से इनकार नहीं कर सकता है, क्योंकि कोड जावा स्पेक के अनुसार औपचारिक रूप से "पहुंच योग्य नहीं है"।

+0

हां इससे मदद मिली। लेकिन यह पढ़ने के बाद मेरे सिर में एक और संदेह आया। चलिए एक उदाहरण लें: कोड 1: 'int a = 4, b; अगर (ए == 4) बी = 5; System.out.println (बी); // त्रुटि- बी प्रारंभ नहीं किया जा सकता है ' यह पूरी तरह से सच है क्योंकि बी के प्रारंभिकरण के भीतर है। लेकिन, निम्नलिखित कोड में: अंतिम int a = 4, b; अगर (ए == 4) बी = 5; System.out.println (बी); // कोई त्रुटि नहीं देता ' आपके उपरोक्त बहस के आधार पर, यह भी त्रुटि दिखाना चाहिए क्योंकि अगर स्थिति में अभिव्यक्ति का मूल्य मूल्यांकन नहीं किया जाना चाहिए। –

+0

उस स्थिति में त्रुटि "पहुंच योग्य कोड" नहीं है, इसलिए उस खंड में चश्मा लागू नहीं होते हैं। आपके पास एक निरंतर अभिव्यक्ति है जो संकलन समय पर 'if (true) 'का मूल्यांकन करती है। कंपाइलर 'if() 'पूरी तरह से और केवल इनलाइन' बी = 5' को पट्टी करेगा। यह एक 'निरंतर अभिव्यक्ति' है क्योंकि 'ए' 'अंतिम' है। – slim

+0

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28 – slim

0
for(final int z=4;z<6;) 
{ 
} 
System.out.println("Test-2"); //unreachable code --> z is final. Its value can't change. There is no way out of that loop 



final int z=4; 
for(;;) 
{ 
    if(z<2) // z is 4 . The compiler only knows the value of "z". It doesn't know what z<2 evaluates to.. So, it still thinks taht there is a chance of getting out of that loop. 
break; 
} 
System.out.println("Test-3"); //So --> reachable code. 
+0

कृपया कोड स्निपेट -2 फिर से देखें। इसका z <2 वहां है। –

+0

@ विकसमंगल - मेरा संपादन जांचें .. – TheLostMind

2

http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21

14,21 से। पहुंचने योग्य वक्तव्य

यदि कोई कथन निष्पादित नहीं किया जा सकता है तो यह एक संकलित-समय त्रुटि है क्योंकि यह पहुंच योग्य नहीं है।

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

उदाहरण के लिए, एक जावा कोड को स्वीकार करेंगे:

{ पूर्णांक एन = 5; जबकि (एन> 7) के = 2; } भले ही एन का मान संकलन समय पर ज्ञात है और सिद्धांत रूप में इसे संकलित समय पर जाना जा सकता है कि के लिए असाइनमेंट कभी निष्पादित नहीं किया जा सकता है।

इस खंड में नियमों को परिभाषित दो तकनीकी शब्दों:

कि क्या एक बयान से पहुंचा जा सकता

है कि क्या एक कथन को पूरा कर सकते हैं सामान्य रूप से

यहाँ परिभाषाएँ एक बयान सामान्य रूप से पूरा करने के लिए केवल यह अगर अनुमति देते हैं पहुंच योग्य है

नियमों के विवरण को कम करने के लिए, पारंपरिक संक्षेप "iff" का अर्थ "अगर और केवल अगर" है।

एक पहुंच योग्य तोड़ बयान, अगर एक बयान बाहर निकालता तोड़ लक्ष्य के भीतर, या तो वहाँ कोई कोशिश बयान जिसका कोशिश ब्लॉक तोड़ वक्तव्य होना, या देखते हैं बयानों जिसका ब्लॉक की कोशिश तोड़ बयान और सभी अंत में शामिल करने की कोशिश कर रहे हैं उन लोगों के खंड कथन सामान्य रूप से पूरा कर सकते हैं।

यह परिभाषा §14.15 में " नियंत्रण स्थानांतरित करने के प्रयासों" के आसपास तर्क पर आधारित है।

एक बयान जारी रखने के लिए एक करते बयान जारी रहता है, भीतर बयान करते हैं, या तो वहाँ कोई कोशिश बयान जिसका कोशिश ब्लॉक शामिल बयान जारी रखने के लिए कर रहे हैं, या वहाँ बयान जिसका ब्लॉक की कोशिश जारी रखने के बयान और सभी अंत में शामिल करने की कोशिश कर रहे हैं उन लोगों के खंड कथन सामान्य रूप से पूरा कर सकते हैं।

ब्लॉक एक निर्माता, विधि, उदाहरण के प्रारंभकर्ता, या स्थिर प्रारंभकर्ता के शरीर है कि पहुंचा जा सकता है:

नियम इस प्रकार हैं।

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

एक गैर-खाली ब्लॉक जो स्विच ब्लॉक नहीं है सामान्य रूप से iff सामान्य विवरण पूरा कर सकता है।

एक गैर-खाली ब्लॉक में पहला कथन जो स्विच ब्लॉक नहीं है पहुंच योग्य है अगर ब्लॉक पहुंच योग्य है।

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

स्थानीय वर्ग घोषणा विवरण सामान्य रूप से पूरा हो सकता है अगर यह पहुंच योग्य है।

स्थानीय परिवर्तनीय घोषणा विवरण सामान्य रूप से पूरा हो सकता है अगर यह पहुंच योग्य है।

एक खाली कथन सामान्य रूप से पूरा हो सकता है अगर यह पहुंच योग्य है।

एक लेबल बयान सामान्य रूप से पूरा कर सकते हैं, तो निम्न में से कम से कम एक सत्य है:

निहित बयान सामान्य रूप से पूरा कर सकते हैं।

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

निहित कथन पहुंच योग्य है अगर लेबल किए गए कथन पहुंच योग्य है।

एक अभिव्यक्ति कथन सामान्य रूप से पूरा हो सकता है अगर यह पहुंच योग्य है।

एक if-then कथन सामान्य रूप से पूरा हो सकता है अगर यह पहुंच योग्य है।

तब-कथन पहुंच योग्य है अगर if-then कथन पहुंच योग्य है।

एक if-then-else कथन सामान्य रूप से पूरा हो सकता है अगर तत्कालीन कथन सामान्य रूप से पूरा हो सकता है या अन्य-कथन सामान्य रूप से पूरा हो सकता है।

तब-कथन पहुंच योग्य है अगर if-then-else कथन पहुंच योग्य है।

अन्य-स्टेटमेंट पहुंच योग्य है अगर if-then-else कथन पहुंच योग्य है।

यदि कोई कथन है, तो यह एक और हिस्सा है, बल्कि असामान्य है। इस खंड के अंत में तर्क दिया गया है।

एक जोरदार विवरण सामान्य रूप से पूरा हो सकता है अगर यह पहुंच योग्य है।

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

स्विच ब्लॉक खाली है या होता है केवल लेबल स्विच करें।

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

अंतिम स्विच ब्लॉक कथन समूह के बाद कम से कम एक स्विच लेबल है।

स्विच ब्लॉक में डिफ़ॉल्ट लेबल नहीं है।

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

एक स्विच ब्लॉक पहुंच योग्य है अगर इसका स्विच स्टेटमेंट पहुंच योग्य है।

यह एक मामले या डिफ़ॉल्ट लेबल भालू: iff अपने स्विच बयान पहुंचा जा सकता है और निम्न में से कम से कम एक सच है

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

स्विच ब्लॉक में इससे पहले एक बयान है और पूर्ववर्ती कथन सामान्य रूप से पूरा हो सकता है।

कुछ समय बयान सामान्य रूप से पूरा कर सकते हैं आईएफएफ निम्न में से कम से कम एक सत्य है:

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

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

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

निहित बयान सामान्य रूप से पूरा कर सकते हैं और हालत अभिव्यक्ति एक निरंतर अभिव्यक्ति (§15.28) सही मूल्य के साथ नहीं है:

एक बयान सामान्य रूप से की निम्नलिखित सच है कम से कम एक iff को पूरा कर सकता है।

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

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

एक पहुंच योग्य ब्रेक स्टेटमेंट है जो डू कथन से बाहर निकलता है।

निहित कथन पहुंच योग्य है अगर डू कथन पहुंच योग्य है।

बयान के लिए एक बुनियादी सामान्य रूप से पूरा कर सकते हैं iff निम्न में से कम से कम एक सत्य है:

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

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

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

कथन के लिए एक बढ़ाया सामान्य रूप से पूरा हो सकता है अगर यह पहुंच योग्य है।

एक ब्रेक, जारी, वापसी, या फेंक स्टेटमेंट सामान्य रूप से पूरा नहीं कर सकता है।

एक सिंक्रनाइज़ कथन सामान्य रूप से पूरा हो सकता है अगर कथन सामान्य रूप से पूरा हो सकता है।

निहित कथन पहुंच योग्य है अगर सिंक्रनाइज़ कथन पहुंच योग्य है।

एक कोशिश बयान निम्न दोनों iff सामान्य रूप से पूरा कर सकते हैं सत्य हैं:

कोशिश ब्लॉक सामान्य रूप से पूरा कर सकते हैं या किसी कैच ब्लॉक सामान्य रूप से पूरा कर सकते हैं।

यदि प्रयास कथन में आखिरकार ब्लॉक है, तो आखिरकार ब्लॉक सामान्य रूप से पूर्ण हो सकता है।

प्रयास ब्लॉक पहुंचने योग्य है अगर प्रयास कथन पहुंच योग्य है।

एक कैच ब्लॉक सी पहुंचा जा सकता है iff निम्न में से दोनों सही हैं:

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

कोई व्यंजक अंतरतम बयान युक्त यह पहुंचा जा सकता है iff पहुंचा जा सकता है फेंक कर सकते हैं ।

सामान्य और अचानक अभिव्यक्तियों के पूर्ण होने के लिए §15.6 देखें।

कोशिश संख्या में पहले कैच ब्लॉक ए नहीं है जैसे कि सी का पैरामीटर टाइप ए के पैरामीटर के प्रकार के उप-वर्ग के समान है।

कैच ब्लॉक का ब्लॉक पहुंचने योग्य है अगर कैच ब्लॉक पहुंच योग्य है।

यदि अंततः ब्लॉक मौजूद है, तो यह पहुंच योग्य है अगर प्रयास कथन पहुंच योग्य है।

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