我想我不明白范围如何在交换机情况下工作。
有人可以向我解释为什么第一个代码没有编译但是第二个代码呢?
代码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”永远不会被声明......
答案 0 :(得分:158)
我将重复其他人所说的内容:每个case
子句中变量的范围对应于整个switch
语句。但是,您可以使用大括号创建更多嵌套范围,如下所示:
int key = 2;
switch (key) {
case 1: {
String str = "1";
return str;
}
case 2: {
String str = "2";
return str;
}
}
生成的代码现在将成功编译,因为每个str
子句中名为case
的变量都在其自己的范围内。
答案 1 :(得分: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;
}
答案 2 :(得分:8)
您似乎假设每个case
都是具有自己的本地范围的块,就像/ else块一样。不是。
纠正这个概念上的错误很重要,否则你会陷入忘记break
case
的频繁陷阱
答案 3 :(得分:2)
我认为这是一个有效的问题,案例陈述的范围假设是不可避免的。 调整自己,因为java编写器使这不正确。
e.g。默认情况下,if语句在其范围内占第一行而不是在break语句显式关闭case结尾的情况下的错误。因此,案例1中的声明:在案例2中不应该可用,并且它具有并行范围但不嵌套。
答案 4 :(得分:0)
可以在一个switch语句中执行几种情况。所以..
答案 5 :(得分:0)
变量的范围存在于switch和if语句的大括号之间。在示例代码1中,switch括号包含变量的两个声明,这将导致编译器出错,因为变量绑定的名称已经完成。
在另一个例子中,它是可以的,因为两个变量都在它们自己的大括号(范围)中声明。
答案 6 :(得分:0)
在第一种情况下,String声明的范围在switch语句中,因此它显示为duplicate,而在第二种情况下,字符串被括在花括号中,这限制了if / else条件中的范围,因此它不是在第二种情况下出错。