【问题标题】:Variable's scope in a switch case [duplicate]开关盒中的变量范围[重复]
【发布时间】:2010-10-08 20:36:47
【问题描述】:

我想我不明白范围在 switch case 中是如何工作的。

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

代码 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”...

【问题讨论】:

标签: java switch-statement


【解决方案1】:

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

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

现在生成的代码将成功编译,因为每个 case 子句中名为 str 的变量都在其自己的范围内。

【讨论】:

  • 听这个家伙的。他是对的。
  • 正确。但是我会对团队中没有非常好的理由使用这种“语法”的任何程序员感到非常恼火。这是混乱和错误的秘诀。它在视觉上隐藏了第一个 case 块(如果不是 return)即使在右大括号之后“继续”的事实 - 并有助于忘记 break
  • 另外:使用break 进行可维护性和错误预防!即使不需要。
  • @mightyuhu break 不起作用,因为有 return 语句...至少对于 Java...C 或 C++ 没问题...
  • @Boy 你可能是对的。然而,这实际上不是我的原意。我认为这些过早的回报会导致各种维护和错误伪装问题,更不用说死代码或圈复杂度了。因此,作为一般建议,至少在不重要的情况下应该避免这种结构
【解决方案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;
}

【讨论】:

  • 选项 3:java switch (key) { case 1: { String str = "1"; return str; } case 2: { String str = "2"; return str; } }
【解决方案3】:

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

纠正这个概念上的错误很重要,否则你最终会掉入忘记case中的break的频繁陷阱

【讨论】:

    【解决方案4】:

    我认为这是一个有效的问题,案例陈述的范围假设是不可避免的。 调整我们自己,因为 java writer 使这不正确。

    例如默认情况下,if 语句在其范围内占据第一行,而不是在 case 结尾被 break 语句显式关闭的情况下有什么问题。因此 case 1: 中的声明不应该在 case 2 中可用,并且它具有并行范围但没有嵌套。

    【讨论】:

      【解决方案5】:

      在一个 switch 语句中可以执行多种情况。所以..

      【讨论】:

        【解决方案6】:

        变量的作用域存在于 switch 和 if 语句的大括号之间。在示例代码 1 中,switch 大括号包含了变量的两个声明,这将导致编译器出错,因为已经生成了变量绑定的名称。

        在另一个例子中没关系,因为两个变量都在它们自己的大括号(作用域)内声明。

        【讨论】:

          【解决方案7】:

          在第一种情况下,字符串声明的范围在 switch 语句中,因此它显示为重复,而在第二种情况下,字符串包含在花括号内,这将范围限制在 if/else 条件内,因此它不是第二种情况出错。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-03-10
            • 1970-01-01
            • 1970-01-01
            • 2021-01-15
            • 2012-09-06
            • 2020-08-14
            相关资源
            最近更新 更多