2010-10-08 4 views
71

Creo que no entiendo cómo funciona el alcance en una caja de interruptor.Alcance de la variable en una caja de interruptor

¿Puede alguien explicarme por qué el primer código no se compila pero el segundo sí?

Código 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; 
} 

Código 2:

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

¿Cómo es que el alcance de la "str" ​​variable no está contenida dentro de la caja 1?

Si me salto la declaración de caso 1 el "str" ​​variables no se declara ...

Respuesta

137

Repetiré lo que otros han dicho: el alcance de las variables en cada cláusula case corresponde a la declaración completa switch. Puede, sin embargo, crear nuevos ámbitos anidados con los apoyos de la siguiente manera:

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

El código resultante ahora se compilará con éxito desde la variable llamada str en cada cláusula case está en su propio ámbito.

+6

Escucha a este tipo. El tiene razón. – John

+21

Correcto. Pero estaría muy molesto con cualquier programador de mi equipo que use esta "sintaxis" sin una MUY buena razón. Es una receta para la confusión y los errores. Oculta visualmente el hecho de que el primer bloque de casos (si no fuera por el 'retorno') "continúa" incluso después del corchete de cierre, y ayuda a olvidar el 'break '. – leonbloy

+2

también: ¡use 'break' para mantener y prevenir errores! incluso si no es requerido. – worenga

9

El alcance de la variable es toda la declaración switch - todos los casos y por defecto, si se incluye.

Estas son algunas otras opciones ...

Opción 1:

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

Opción 2:

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

Varios casos puede ser ejecutado en una sentencia switch. Entonces ...

0

El alcance de una variable existe entre las llaves de las instrucciones switch y if. En el Código de ejemplo 1, las llaves de interruptor encierran ambas declaraciones de las variables que causarán un error en el compilador ya que el enlace de nombre a variable ya se habrá realizado.

En el otro ejemplo, está bien porque ambas variables se declaran dentro de sus propias llaves (alcance).

8

Parece que asume que cada case es un bloque con su propio ámbito local, como bloques if/else. No es.

Es importante corregir este error conceptual, porque de lo contrario va a terminar cayendo en la trampa frecuente de olvidar la break dentro del case

0

En el primer caso, el alcance de la declaración de cuerdas está dentro de la instrucción switch, por tanto, se muestra como duplicado, mientras que en el segundo, la cadena se incluye entre llaves, lo que limita el alcance dentro de las condiciones if/else, por lo tanto, no es un error en el segundo caso.

2

Creo que es una pregunta válida, y la suposición de alcance para la declaración de casos es inevitable. Ajustándonos a él porque el escritor de Java ha hecho esto incorrecto.

p. Ej.si la instrucción por defecto toma la primera línea en su alcance que lo que está mal en los casos en que el final del caso está explícitamente cerrado por la declaración de interrupción. Por lo tanto, la declaración en el caso 1: no debería estar disponible en el caso 2 y tiene un alcance paralelo pero no anidado.

Cuestiones relacionadas