He encontrado este caso un poco peculiar:
int x = 1;
switch(x){
case 0 :
boolean b = false;
break;
case 1 :
b = true; //will compile just right
System.out.println(b); //will print true
break;
default:
System.out.println(b); //will not compile
}
Sólo creo que esto es confuso. Las variables locales se dice que son accesibles dentro de todo el bloque de códigos. Claro, b
está dentro de un bloque de interruptores de modo que puedo entender que se puede acceder en un caso diferente, a pesar de que esto parece contradecir el flujo interruptor que no puede pasar por el primer caso, y por lo tanto, no se puede declarar e inicializar b
.
Pero no es esto otra vez contradiciendo si b
mientras tanto sigue siendo inaccesible en la rama por defecto?
¿Hay alguna ejecución especial para las declaraciones de variables locales en una rama caso de que se ejecutará si el caso ha sido igualado o no? Si es así, entonces ¿por qué no se puede acceder por defecto rama de ella?
Editar de la bandera duplicado: La cuestión aquí no se trata de cómo la variable declarada en una rama caso no es local (como he señalado antes), pero en su lugar, ¿por qué la variable local declarada dentro de una caja es accesible desde fuera, pero no el valor se ha inicializado con.
Encontrado una pregunta similar que creo que responde a mi pregunta: Declarar e inicializar variables dentro de los interruptores de Java
El punto clave es que los medios de caso por defecto: ningún otro caso fue tomada.
La construcción switch le permite tener variables locales dentro de su alcance global, pero aún así cada uno "leer" debe ver una "escritura" antes.
Y el compilador puede detectar fácilmente que el caso por defecto no vio una inicialización para b .
Más allá de eso, la razón por la que puede tener este tipo de asignaciones en diferentes casos es: la sentencia switch general sólo se tiene una "bloque de interruptores".
Ver el lenguaje Java de especificaciones para más detalles!