Java开关:变量声明和范围

Mar*_*Ion 8 java scope initialization switch-statement variable-declaration

Java编译器如何处理以下交换机块?'b'变量的范围是什么?

请注意,'b'变量仅在switch语句的第一个分支中声明.尝试在第二个分支中声明它也会导致"重复的局部变量"编译错误.

    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);
    }
Run Code Online (Sandbox Code Playgroud)

注意:上面的代码用java 1.6编译器编译.

aio*_*obe 22

范围与通常一样,由{和分隔}.

  • 给OP的消息,你可以在每个案例周围加上大括号,然后就行了.如在案例1中:{doHere(); 打破; }` (7认同)

Kai*_*Kai 12

范围b是块.你只有一个包含所有cases的块.这就是你b在第二次重新声明时遇到编译错误的原因case.

你可以将每个包装case在一个自己的块中

case 0:
   {
     int b = 1;
     ...
   }
case 1:
   {
     int b = 2;
     ...
   }
Run Code Online (Sandbox Code Playgroud)

但我认为FindBugs或CheckStyle会抱怨这一点.

  • 编译错误不是来自_redeclaring_`b`,而是在初始化之前访问它.`b`在0,1和0的情况下完全有效,因为正如你所提到的那样,它在范围内.他的注释行未编译的问题是b在访问之前未初始化. (4认同)