7

In che modo il compilatore Java gestisce il seguente blocco di switch? Qual è lo scopo della variabile 'b'?Switch Java: dichiarazione delle variabili e scope

Si noti che la variabile 'b' viene dichiarata solo nel primo ramo dell'istruzione switch. Anche il tentativo di dichiararlo nel secondo ramo genera un errore di compilazione "variabile locale duplicata".

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); 
    } 

Nota: il codice sopra riportato viene compilato con un compilatore java 1.6.

+0

Ho risposto alla tua domanda. – darrengorman

risposta

21

L'ambito è, come al solito, delimitato da { e }.

+7

Messaggio a OP, puoi mettere le parentesi attorno a ciascun caso e poi funzionerà. Come nel caso 1: {doHere(); rompere; } ' – jn1kk

10

L'ambito di b è il blocco. Hai solo un blocco che include tutti i case s. Per questo motivo viene visualizzato un errore di compilazione quando si dichiara nuovamente b nel secondo case.

Si potrebbe avvolgere ogni case in un blocco proprio come

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

ma penso FindBugs o CheckStyle si lamentano di questo.

+4

L'errore di compilazione non deriva da _redeclaring_' b' ma dall'accesso prima che sia inizializzato. 'b' è perfettamente valido nel caso 0, 1, e di default perché, come dici tu, è in ambito.Il problema con la sua linea commentata che non si sta compilando è che b non è inizializzato prima di accedervi. – NominSim

+0

Avrei dovuto leggere la domanda più cauta. Ho pensato che stava facendo 'int b = 2' nella riga commentata ;-) – Kai

0

I blocchi case non hanno alcun ambito locale. Non è una serie di if ... else if ... else blocchi, Java lo implementa come una serie di GOTO s.

3

Il campo di applicazione b è il blocco di switch - tra la dichiarazione e il delimitatore } -

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 

Tuttavia, è necessario sapere che se si dichiara la int b all'interno del case 1:, non sarà avere accesso a la variabile b all'interno del case 0:

Per rispondere alla domanda si chiede in java commenti è possibile controllare questo esempio semplice:

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

Spero che aiuti.

1

nel codice se a non è uguale a 0 b non verrà mai inizializzato. dovresti definire b prima dell'istruzione switch.

+0

Il problema è in fase di compilazione, non in fase di runtime. –

0

L'ambito delle variabili definito in una dichiarazione switch() è lo stesso di un blocco normale che è circondato da { e }.

Pertanto, ogni variabile definita in un'istruzione switch() è visibile per l'intero blocco, una volta definita.

3

È possibile definire l'ambito utilizzando {} attorno al caso.

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); 
} 
} 
Problemi correlati