Java的开关:变量声明和范围(Java switch : variable declaration

2019-06-25 06:50发布

如何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编译器编译。

Answer 1:

范围,就如同往常一样,通过分隔{}



Answer 2:

的范围b是块。 你只有一个街区,其中包括所有的case秒。 这就是为什么,当你重新声明得到一个编译错误b在你的第二个case

你可以包装每个case中的自己像块

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

但我认为FindBugs的CheckStyle的还是会抱怨说。



Answer 3:

的范围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
}

希望能帮助到你。



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


Answer 5:

在你的代码,如果一个不等于0 B将永远不会被初始化。 您switch语句之前,应该定义湾



Answer 6:

你的case块没有任何局部范围。 这不是一个系列if ... else if ... else块,JAVA实现它为一系列GOTO秒。



Answer 7:

的一个中定义的变量范围switch()语句将是相同的如在正常块至极由包围{}

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



文章来源: Java switch : variable declaration and scope