2010-10-08 99 views
71

我想我不明白开关柜的范围是如何工作的。开关柜中的变量范围

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

代码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”从未宣布的声明...

回答

137

我会重复别人所说的:每个case子句中变量的范围对应于整个switch声明。你可以,但是,创建一个括号进一步嵌套范围如下:

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

生成的代码,因为现在每个case条款命名str变量成功编译是在它自己的范围之内。

+6

听这家伙。他是对的。 – John 2010-10-09 02:26:19

+21

正确。但是我会对我的团队中使用这个“语法”的程序员非常恼火,而没有很好的理由。这是一个混乱和错误的秘诀。它在视觉上隐藏了第一个case块(如果它不是'return'),即使在右大括号之后“仍然继续”的事实,并有助于忘记'break'。 – leonbloy 2011-05-18 18:16:43

+2

另外:使用'break'来维护和防止错误!即使不需要。 – worenga 2014-11-28 19:26:14

9

变量的范围是整个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; 
} 
0

一些情况下可以在一个switch语句来执行。所以..

0

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

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

8

你似乎认为每个case是一个有自己的本地作用域的块,就像if/else块一样。不是。

改正这个概念的错误,因为否则你会最终落入忘记case

0

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

2

我认为这是一个有效的问题,并且案例陈述的范围假设是不可避免的。 调整自己,因为Java作家已经使这不正确。

例如如果缺省语句在其范围中占第一行,而不是在case语句的结尾由break语句明确关闭的情况下出现问题。因此,情况1中的声明:情况2中不应该可用,并且它具有并行范围但不是嵌套的。