10

Java 编译器如何处理下面的 switch 块?'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 编译器编译。

4

7 回答 7

22

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

于 2012-06-07T13:40:26.310 回答
12

的范围b是块。您只有一个包含所有cases 的块。这就是为什么您b在第二个case.

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

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

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

于 2012-06-07T13:40:27.777 回答
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
}

希望能帮助到你。

于 2012-06-07T13:41:43.397 回答
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);
}
}
于 2015-11-30T13:25:26.497 回答
1

在您的代码中,如果 a 不等于 0 b 将永远不会被初始化。您应该在 switch 语句之前定义 b 。

于 2012-06-07T13:42:53.280 回答
0

您的case块没有任何本地范围。不是一串if……块,java把它实现为一串s。else ifelseGOTO

于 2012-06-07T13:41:39.217 回答
0

语句中定义的变量范围与由andswitch()包围的普通块中的范围相同。{}

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

于 2012-06-07T14:02:57.327 回答