7

जावा कंपाइलर निम्न स्विच ब्लॉक को कैसे संभालता है? 'बी' चर का दायरा क्या है?जावा स्विच: परिवर्तनीय घोषणा और दायरा

ध्यान दें कि 'बी' चर केवल स्विच स्टेटमेंट की पहली शाखा में घोषित किया जाता है। इसे दूसरी शाखा में घोषित करने का प्रयास करते हुए परिणामस्वरूप "डुप्लिकेट स्थानीय चर" संकलन त्रुटि में परिणाम मिलता है।

int a = 3; 
    switch(a) { 
    case 0: 
     int b = 1; 
     System.out.println("case 0: b = " + b); 
     break; 
    case 1: 
     // the following line does not compile: b may not have been initialized 
     // System.out.println("case 1 before: b = " + b); 
     b = 2; 
     System.out.println("case 1 after: b = " + b); 
     break; 
    default: 
     b = 7; 
     System.out.println("default: b = " + b); 
    } 

नोट: उपरोक्त कोड जावा 1.6 कंपाइलर के साथ संकलित करता है।

+0

अपने स्वयं के प्रश्न का उत्तर दें। – darrengorman

उत्तर

21

दायरा सामान्य रूप से { और } द्वारा सीमित है।

+7

ओपी को संदेश, आप प्रत्येक मामले के आसपास ब्रेसिज़ डाल सकते हैं और फिर यह काम करेगा। जैसा मामला 1: {doHere(); टूटना; } ' – jn1kk

10

b का दायरा ब्लॉक है। आपके पास केवल एक ब्लॉक है जिसमें सभी case एस शामिल हैं। यही कारण है कि जब आप b को अपने दूसरे case में पुन: प्राप्त करते हैं तो आपको एक संकलन त्रुटि मिलती है।

आप की तरह

case 0: 
    { 
    int b = 1; 
    ... 
    } 
case 1: 
    { 
    int b = 2; 
    ... 
    } 

एक स्वयं के ब्लॉक में प्रत्येक case लपेट सकता है, लेकिन मुझे लगता है कि FindBugs या CheckStyle कि के बारे में शिकायत करेंगे।

+4

संकलन त्रुटि _redeclaring_' b' से नहीं है लेकिन इसे आरंभ करने से पहले इसे एक्सेस करने से है। 'बी' 0, 1, और डिफ़ॉल्ट के मामले में पूरी तरह मान्य है क्योंकि जैसा कि आप उल्लेख करते हैं कि यह दायरे में है।उनकी टिप्पणी की गई पंक्ति के साथ समस्या संकलित नहीं है कि बी को एक्सेस करने से पहले प्रारंभ नहीं किया गया है। – NominSim

+0

मुझे प्रश्न को और सावधानी से पढ़ना चाहिए था। मैंने सोचा कि वह टिप्पणी लाइन में 'int b = 2' कर रहा था ;-) – Kai

0

आपके case ब्लॉक में कोई स्थानीय क्षेत्र नहीं है। यह if की श्रृंखला नहीं है ... else if ... else ब्लॉक, जावा इसे GOTO एस की श्रृंखला के रूप में लागू करता है।

3

b के दायरे स्विच ब्लॉक है - घोषणा और सीमांकक } के बीच -

int a = 3; 

switch(a) { 
    case 0: 
      int b = 1; //scope starts 
      System.out.println("case 0: b = " + b); 
      break; 
    case 1: 
      // the following line does not compile: b may not have been initialized 
      // System.out.println("case 1 before: b = " + b); 
      b = 2; 
      System.out.println("case 1 after: b = " + b); 
      break; 
    default: 
      b = 7; 
      System.out.println("default: b = " + b); 
}//scope ends 

हालांकि, आप को पता है कि अगर आप case 1: अंदर int b घोषित, आप के लिए पहुँच नहीं होगा की जरूरत है चर bcase 0:

अंदर सवाल आप जावा में पूछना उत्तर देने के लिए आप इस सरल उदाहरण जांच कर सकते हैं टिप्पणियाँ:

int b; 
if(true){ 
    b++; //The local variable b hast not been initialized 
} 

उम्मीद है कि यह मदद करता है।

1

यदि आपके कोड में 0 बी के बराबर नहीं है तो कभी भी प्रारंभ नहीं किया जाएगा। आपको स्विच स्टेटमेंट से पहले बी को परिभाषित करना चाहिए।

+0

समस्या संकलन समय पर नहीं है, रनटाइम पर नहीं। –

0

switch() कथन में परिभाषित चर के दायरे एक सामान्य ब्लॉक के समान होंगे जो { और } से घिरा हुआ है।

इसलिए switch() कथन में परिभाषित प्रत्येक चर को परिभाषित करने के बाद पूरे ब्लॉक के लिए दृश्यमान होता है।

3

आप अपने मामले के आसपास {} का उपयोग करके दायरे को परिभाषित कर सकते हैं।

int a = 3; 
switch(a) { 
case 0: { 
    int b = 1; 
    System.out.println("case 0: b = " + b); 
    break; 
} 
case 1: { 
    // the following line does not compile: b may not have been initialized 
    // System.out.println("case 1 before: b = " + b); 
    int b = 2; 
    System.out.println("case 1 after: b = " + b); 
    break; 
} 
default: { 
    int b = 7; 
    System.out.println("default: b = " + b); 
} 
}