开关盒中的变量范围

Phi*_*ere 91 java switch-statement

我想我不明白示波器如何在开关盒中工作.

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

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

代码2:

 int key = 2;
 if (key == 1) {
      String str = "1";
      return str;
 } else if (key == 2) {
      String str = "2";
      return str;
 }
Run Code Online (Sandbox Code Playgroud)

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

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

Ric*_*ook 163

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

int key = 2;
switch (key) {
case 1: {
    String str = "1";
    return str;
  }
case 2: {
    String str = "2";
    return str;
  }
}
Run Code Online (Sandbox Code Playgroud)

由于str每个case子句中指定的变量都在自己的范围内,因此生成的代码现在将成功编译.

  • 正确.但是我会对团队中任何使用这种"语法"而没有充分理由的程序员感到非常恼火.这是一个混乱和错误的秘诀.它在视觉上隐藏了这样一个事实,即第一个案例块(如果它不是"返回")"继续"甚至在关闭括号之后 - 并且有助于忘记'break`. (25认同)
  • 听听这个家伙.他是对的. (9认同)
  • 另外:使用`break`来实现可维护性和bug预防!即使不是必需的. (3认同)
  • @Boy你可能是对的.然而,这实际上不是我原来的观点.我认为那些过早的回报导致所有类型的维护和错误伪装问题,更不用说死代码或圈复杂度.因此,作为一般性建议,至少在不是微不足道的情况下,应该避免这种结构 (2认同)

Dre*_*lls 9

变量的范围是整个switch语句 - 所有情况和默认值(如果包含).

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

选项1:

int key = 2;
switch (key) {
case 1:
     return "1";
case 2:
     return "2";
}
Run Code Online (Sandbox Code Playgroud)

选项2:

int key = 2;
String str = null;
switch (key) {
case 1:
     str = "1";
     return str;
case 2:
     str = "2";
     return str;
}
Run Code Online (Sandbox Code Playgroud)


leo*_*loy 8

您似乎假设每个case都是具有自己的本地范围的块,就像if/else块一样.不是.

纠正这个概念上的错误很重要,因为否则你会陷入忘记break内部错误的频繁陷阱case