开关盒中的变量范围[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开关盒中的变量范围[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

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

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

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

答案

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

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

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

另一答案

变量的范围是整个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;
}
另一答案

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

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

另一答案

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

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

另一答案

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

另一答案

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

在另一个例子中,它是可以的,因为两个变量都在它们自己的大括号(范围)中声明。

另一答案

在第一种情况下,String声明的范围在switch语句中,因此它显示为duplicate,而在第二种情况下,字符串被括在花括号中,这限制了if / else条件中的范围,因此它不是错误第二种情况。

以上是关于开关盒中的变量范围[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何创建片段以重复变量编号中的代码行

Chrome开发工具:监视变量不可用(无法在封闭范围内检测到)[重复]

如何使用Android片段管理器传递变量[重复]

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]

函数定义中的Python变量范围[重复]

当前范围错误中的重复声明;两个循环具有相同的变量,可变范围