2010-06-17 22 views
7

मेरे आश्चर्य करने के लिए इस कोड को ठीक काम करता है:स्विच स्टेटमेंट में संदर्भ कब घोषित किए जाते हैं?

int i = 2; 
switch(i) { 
case 1: 
    String myString = "foo"; 
    break; 
case 2: 
    myString = "poo"; 
    System.out.println(myString); 
} 

लेकिन स्ट्रिंग संदर्भ घोषित किया जा कभी नहीं करना चाहिए? क्या यह हो सकता है कि हर मामले के तहत सभी चर हमेशा घोषित किए जाते हैं कि इससे कोई फर्क नहीं पड़ता, या यह कैसे हल किया जाता है?

+1

नहीं सभी घोषणाओं {...} उन्हें धारक ब्लॉक की शुरुआत में किया जाता है? –

+0

मुझे लगता है कि जूल्स सही है। जावा में स्थैतिक क्षेत्र हैं इसलिए नियंत्रण प्रवाह वैरिएबल के निर्माण (प्रारंभिक के विपरीत) को प्रभावित नहीं करता है। स्विच ब्लॉक में प्रवेश करने पर स्टैक पर जगह आवंटित की जाती है। लेकिन यह अभी भी curios की तरह है। जीसीसी ने मुझे लगता है कि (अगर मुझे लगता है) के बराबर सी कोड संकलित करने से इंकार कर दिया गया है, तो जावा 'if (someBool) स्ट्रिंग एस = "foo" संकलित करने से इंकार कर देता है; ' – musiKk

उत्तर

7

ठीक है, यह ब्रैकेट्स (यानी स्कोप) के बारे में है।

यह बेहतर अभ्यास, यकीनन, इसलिए की तरह अपने बयान लिखने के लिए है:

int i = 2; 
switch(i) { 
    case 1: { 
     String myString = "foo"; 
     break; 
    } 
    case 2: { 
     myString = "poo"; 
     System.out.println(myString); 
    } 
} 

(मैं एक जावा के पास अभी नहीं कर रहा हूँ, लेकिन यह संकलन नहीं होना चाहिए)।

+0

मैंने आज कुछ नया सीखा! –

+2

वास्तव में यह संकलित नहीं करता है। – musiKk

+0

@musikk: पुष्टि करने के लिए धन्यवाद, अक्सर मुझे खुशी नहीं है कि कुछ संकलित नहीं होता है :) –

3

MyString घोषणा का दायरा स्विच ब्लॉक (जहां {वर्ण है) है। आप इसे इस तरह लिखने के लिए थे, तो घोषणा प्रति-मामला होगा:

int i = 2; 
switch(i) { 
    case 1: { 
     String myString = "foo"; 
     break; 
    } 

    case 2: { 
     String myString = "poo"; 
     System.out.println(myString); 
    } 
} 
संबंधित मुद्दे