为什么我不能在每个具有相同名称的情况下创建变量。例如,从下面的代码中,在case 3
中,它会抱怨String name
已经存在 - 但为什么会这样? Case 1
从来没有,也永远不会被召唤。
我不想从switch-case
中提取定义。
那么为什么使用if
语句可以在每种情况下定义相同的名称,但在switch-case
中却没有?
这是一个带有switch case的简单Java代码:
int type = 3;
switch (type) {
case 1:
String name = (String) respone.get("name");
user.setName(name);
break;
case 2:
String surname = (String) respone.get("surname");
user.setSurname(surname);
break;
case 3:
String name = (String) respone.get("name");
user.clearName(name);
break;
default:
...
}
答案 0 :(得分:7)
将每个case语句写在不同的块中:
switch (type) {
case 1: {
String name = (String) respone.get("name");
user.setName(name);
break;
}
case 2: {
String surname = (String) respone.get("surname");
user.setSurname(surname);
break;
}
...
}
答案 1 :(得分:4)
name
已经存在,因为案例在概念上属于同一个块。案例:基本上是标签,switch
语句只是跳转到相应的标签。请参阅here for more info on labels in Java(不限于switch
声明)。
要想看到这一点,想象一下你是否没有break语句。您可以在一个name
子句中初始化case
,然后转到下一个子句。如果这是一个问题,请将每个case子句包含在单独的{}
块中。
答案 2 :(得分:0)
因为即使它们是互斥的,它们也存在于同一Switch
块中。因此,您可以在单独的块中编写每个case子句,以避免该错误。
答案 3 :(得分:0)
请注意,case
不是您的范围,块是{ .. }
答案 4 :(得分:0)
整个开关包含在一个块中。您可以将每个案例包装在一个自己的块中:
case 1: {
String name = (String) respone.get("name");
user.setName(name);
break;
}
case 2: {
String surname = (String) respone.get("surname");
user.setSurname(surname);
break;
}
case 3: {
String name = (String) respone.get("name");
user.clearName(name);
break;
}
答案 5 :(得分:0)
如果在switch中声明没有大括号的变量,则其范围将保留在整个开关中。
无论你在哪里声明它的第一个开关块或第二个。如果你先声明它,那么它可以通过out switch进行访问。
如果你想拥有相同的变量名,那么你可以通过放入大括号或块来实现,因为那个变量范围保留在块中。
switch (type) {
case 1: {
String name = (String) respone.get("name");
user.setName(name);
break;
}
case 2: {
String surname = (String) respone.get("surname");
user.setSurname(surname);
break;
}
case 3: {
String name = (String) respone.get("name");
user.clearName(name);
break;
}
default:
...
}