10

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.

0

7 Answers 7

22

The scope is, just as usual, delimited by { and }.

Sign up to request clarification or add additional context in comments.

1 Comment

Message to OP, you can put braces around each case and then it would work. As in case 1: { doHere(); break; }
12

The scope of b is the block. You have only one block which includes all cases. 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.

2 Comments

The compile error is not from redeclaring b but from accessing it before it is initialized. b is perfectly valid in case 0, 1, and default because as you mention it is in scope. The issue with his commented line not compiling is that b is not initialized before it is accessed.
I should have read the question more careful. I thought he was doing int b = 2 in the commented out line ;-)
4

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.

Comments

4

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

Comments

1

in your code if a is not equal to 0 b will never be initialized. you should define b before the switch statement.

1 Comment

The problem is at compile time, not at runtime.
0

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 GOTOs.

Comments

0

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.