variables在开关情况下的范围

我想我不明白范围如何在一个开关的情况下工作。

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

代码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; } 

情况1中没有包含variables“str”的范围?

如果我跳过情况1的声明variables“str”从未声明…

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

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

由于每个case子句中名为str的variables都在其自己的范围内,所以现在的代码将成功编译。

variables的范围是整个switch语句 – 所有的case和default,如果包含的话。

这里有一些其他的select…

选项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都是一个有自己的本地作用域的块,就像if / else块一样。 不是。

纠正这个概念上的错误是很重要的,否则,你将会终结在忘记case的频繁陷阱中

我认为这是一个有效的问题,案件陈述的范围假设是不可避免的。 因为Java作家使这个不正确。

例如,如果缺省语句在其范围内占用第一行,而不是由break语句明确地closures了case的情况。 因此,情况1中的声明:在情况2中不可用,并且具有并行范围但不是嵌套的。

在一个switch语句中可以执行几个例子。 所以..

交换机的大括号和if语句之间存在一个variables的作用域。 在示例代码1中,开关大括号包含variables的声明,这将导致编译器出错,因为variables绑定的名称已经生成。

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

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