How does the Java compiler handle the following switch block ?
What is the scope of the 'b' variable ?
Note that the 'b' variable is declared only in the first branch of the switch statement. Attempting to declare it in the second branch as well results in a "duplicate local variable" compilation error.
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);
}
Note: the above code compiles with a java 1.6 compiler.
The scope is, just as usual, delimited by {
and }
.
The scope of b
is the block. You have only one block which includes all case
s. That's why you get a compile error when you redeclare b
in your second case
.
You could wrap each case
in an own block like
case 0:
{
int b = 1;
...
}
case 1:
{
int b = 2;
...
}
but I think FindBugs or CheckStyle would complain about that.
The scope of b
is the switch block - between the declaration and the delimiter }
-
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
However, you need to know that if you declare the int b
inside the case 1:
, you will NOT have access to the variable b
inside the case 0:
To answer the question you ask in the java comments you can check this simpler example:
int b;
if(true){
b++; //The local variable b hast not been initialized
}
Hope it helps.
You can define the scope using {} around your case.
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);
}
}
in your code if a is not equal to 0 b will never be initialized. you should define b before the switch statement.
Your case
blocks do not have any local scope. It's not a series of if
...else if
...else
blocks, java implements it as a series of GOTO
s.
The Scope of variables defined in a switch()
statement would be the same as in a normal block wich is surround by {
and }
.
Therefore every variable defined in a switch()
statement is visible for the whole block, once it is defined.