开关情况下的变量作用域

2022-08-31 09:59:33

我想我不明白示波器在开关情况下是如何工作的。

有人可以向我解释为什么第一个代码不能编译,但第二个代码可以编译吗?

代码 1 :

 int key = 2;
 switch (key) {
 case 1:
      String str = "1";
      return str;
 case 2:
      String str = "2"; // duplicate declaration of "str" according to Eclipse.
      return str;
 }

代码 2 :

 int key = 2;
 if (key == 1) {
      String str = "1";
      return str;
 } else if (key == 2) {
      String str = "2";
      return str;
 }

为什么变量“str”的范围不包含在案例1中?

如果我跳过案例1的声明,变量“str”永远不会被声明...


答案 1

我将重复其他人说过的话:每个子句中变量的范围对应于整个语句。但是,您可以使用大括号创建更多嵌套作用域,如下所示:caseswitch

int key = 2;
switch (key) {
case 1: {
    String str = "1";
    return str;
  }
case 2: {
    String str = "2";
    return str;
  }
}

生成的代码现在将成功编译,因为每个子句中指定的变量都在其自己的作用域中。strcase


答案 2

变量的作用域是整个语句 -- 所有情况和默认值(如果包含)。switch

以下是一些其他选项...

选项 1:

int key = 2;
switch (key) {
case 1:
     return "1";
case 2:
     return "2";
}

选项 2:

int key = 2;
String str = null;
switch (key) {
case 1:
     str = "1";
     return str;
case 2:
     str = "2";
     return str;
}