variable una reglas nombres inicializacion guardar for ejemplos declaracion java scope initialization switch-statement variable-declaration

una - Conmutador Java: declaración de variable y alcance



variable decimal en java (7)

¿Cómo maneja el compilador de Java el siguiente bloque de conmutadores? ¿Cuál es el alcance de la variable ''b''?

Tenga en cuenta que la variable ''b'' se declara solo en la primera rama de la instrucción switch. Intentar declararlo en la segunda rama también produce un error de compilación de "variable local duplicada".

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: el código anterior se compila con un compilador de Java 1.6.


El alcance de b es el bloque del interruptor - entre la declaración y el delimitador } -

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

Sin embargo, debe saber que si declara el int b dentro del case 1: NO tendrá acceso a la variable b dentro del case 0:

Para responder a la pregunta que hace en los comentarios de java, puede verificar este ejemplo más simple:

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

Espero eso ayude.


El alcance de b es el bloque. Solo tiene un bloque que incluye todas las case y case . Es por eso que obtienes un error de compilación cuando redeclaras b en tu segundo case .

Puedes envolver cada case en un bloque propio como

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

pero creo que FindBugs o CheckStyle se quejarían de eso.


El alcance de las variables definidas en una instrucción switch() sería el mismo que en un bloque normal que está rodeado por { y } .

Por lo tanto, cada variable definida en una instrucción switch() es visible para todo el bloque, una vez que está definido.


El alcance es, como de costumbre, delimitado por { y } .


Sus bloques de case no tienen alcance local. No es una serie de bloques if ... else if ... else , java lo implementa como una serie de GOTO s.


en su código si a no es igual a 0 b nunca se inicializará. usted debe definir b antes de la declaración de cambio.


Puede definir el alcance usando {} alrededor de su 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); } }