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条件中,因此它不是错误第二种情况。