Java开关:变量声明和范围

时间:2012-06-07 13:38:06

标签: 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);
    }

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

7 个答案:

答案 0 :(得分:22)

范围与往常一样,由{}分隔。

答案 1 :(得分:11)

b的范围是块。您只有一个包含所有case的块。这就是您在第二个b重新声明case时出现编译错误的原因。

您可以将每个case包装在自己的块中,例如

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

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

答案 2 :(得分:4)

b的范围是切换块 - 在声明和分隔符}之间 -

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

但是,您需要知道,如果您在int b内声明case 1:,则无法访问b case 0: >

要回答您在java评论中提出的问题,您可以查看这个更简单的示例:

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

希望它有所帮助。

答案 3 :(得分:4)

您可以使用{}围绕您的案例定义范围。

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

答案 4 :(得分:1)

如果a不等于0,则代码中的

将永远不会被初始化。你应该在switch语句之前定义b。

答案 5 :(得分:0)

您的case块没有任何本地范围。这不是一系列if ... else if ... else块,java将其实现为一系列GOTO s。

答案 6 :(得分:0)

switch()语句中定义的变量范围与{}环绕的普通块中的变量范围相同。

因此,switch()语句中定义的每个变量在整个块定义后都是可见的。