2010-10-08 21 views
71

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

क्या कोई मुझे समझा सकता है कि पहला कोड संकलित क्यों नहीं करता है लेकिन दूसरा करता है?

कोड 1:

int key = 2; 
switch (key) { 
case 1: 
     String str = "1"; 
     return str; 
case 2: 
     String str = "2"; // duplicate declaration of "str" according to Eclipse. 
     return str; 
} 

कोड 2:

int key = 2; 
if (key == 1) { 
     String str = "1"; 
     return str; 
} else if (key == 2) { 
     String str = "2"; 
     return str; 
} 

कैसे चर "str" ​​के दायरे में आ केस 1 के भीतर निहित नहीं है? सभी मामलों और डिफ़ॉल्ट, अगर शामिल -

अगर मैं मामले 1 चर "str" ​​घोषित कर दिया कभी नहीं है की घोषणा को छोड़ ...

उत्तर

137

मैं दोहरा दूंगा जो दूसरों ने कहा है: प्रत्येक case खंड में चर के दायरे पूरे switch कथन से मेल खाते हैं।

int key = 2; 
switch (key) { 
case 1: { 
    String str = "1"; 
    return str; 
    } 
case 2: { 
    String str = "2"; 
    return str; 
    } 
} 

जिसके परिणामस्वरूप कोड अब प्रत्येक case खंड में str नामित चर के बाद से सफलतापूर्वक संकलित कर देगा अपने स्वयं के दायरे में है: हालांकि, आप ब्रेसिज़ के साथ आगे नेस्टेड स्कोप इस प्रकार बना सकते हैं।

+6

इस लड़के को सुनो। वह सही है। – John

+21

सही। लेकिन मैं अपनी टीम में किसी भी प्रोग्रामर से बहुत नाराज हूं जो बहुत अच्छे कारण के बिना इस "वाक्यविन्यास" का उपयोग करता है। यह भ्रम और बग के लिए एक नुस्खा है। यह दृष्टि से इस तथ्य को छुपाता है कि पहला मामला ब्लॉक (यदि यह 'वापसी' के लिए नहीं था) बंद ब्रेस के बाद भी "जारी रहता है" - और 'ब्रेक' को भूलने में मदद करता है। – leonbloy

+2

भी: रखरखाव और बग रोकथाम के लिए 'ब्रेक' का उपयोग करें! भले ही आवश्यक नहीं है। – worenga

9

चर का दायरा पूरे switch बयान है।

यहाँ कुछ अन्य विकल्प हैं ...

विकल्प 1:

int key = 2; 
switch (key) { 
case 1: 
    return "1"; 
case 2: 
    return "2"; 
} 

विकल्प 2:

int key = 2; 
String str = null; 
switch (key) { 
case 1: 
    str = "1"; 
    return str; 
case 2: 
    str = "2"; 
    return str; 
} 
0

कई मामलों एक स्विच बयान में क्रियान्वित किया जा सकता। तो ..

0

स्विच के ब्रेसिज़ और कथन के बीच एक चर का दायरा मौजूद है। उदाहरण में कोड 1 स्विच ब्रेसिज़ चर के दोनों घोषणाओं को संलग्न करता है जो संकलक को त्रुटि के कारण बनता है क्योंकि परिवर्तनीय बाध्यकारी के नाम पहले से ही किए जा चुके हैं।

दूसरे उदाहरण में यह ठीक है क्योंकि दोनों चर अपने स्वयं के ब्रेसिज़ (स्कोप) के भीतर घोषित किए जाते हैं।

8

आपको लगता है कि प्रत्येक case अपने स्थानीय दायरे के साथ एक ब्लॉक है, जैसे कि/अन्य ब्लॉक। यह।

यह इस वैचारिक गलती सुधारने की, क्योंकि अन्यथा आप breakcase

0

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

2

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

उदा।यदि डिफ़ॉल्ट रूप से कथन पहले दायरे में पहली पंक्ति लेता है, तो मामले के अंत में जहां गलत है तो ब्रेक स्टेटमेंट द्वारा स्पष्ट रूप से बंद किया जाता है। इसलिए मामले 1 में घोषणा: 2 मामले में उपलब्ध नहीं होनी चाहिए और इसमें समानांतर दायरा है लेकिन घोंसला नहीं है।

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