Java switch : variable declaration and scope

后端 未结 7 633
予麋鹿
予麋鹿 2020-12-11 03:14

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 b

相关标签:
7条回答
  • 2020-12-11 03:44

    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);
    }
    }
    
    0 讨论(0)
  • 2020-12-11 03:45

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

    0 讨论(0)
  • 2020-12-11 03:45

    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.

    0 讨论(0)
  • 2020-12-11 03:59

    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.

    0 讨论(0)
  • 2020-12-11 03:59

    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.

    0 讨论(0)
  • 2020-12-11 03:59

    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.

    0 讨论(0)
提交回复
热议问题