2013-03-20 21 views
3

为什么我不能在每个具有相同名称的情况下创建变量。例如,从下面的代码中,case 3它会抱怨String name已经存在 - 但为什么呢? Case 1从来没有,也永远不会被调用。重新实例化开关盒中的变量

我不想从switch-case中提取出定义。 那么为什么要使用if语句来定义每种情况下的相同名称,但是在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: 
     ... 
} 
+1

答案可能是“因为”。我猜测这是因为''case:'块在编译器方面并不是真正的块 - 它们是在一个'switch'块中得到的标签。所以局部变量的范围就是那个开关块。 – millimoose 2013-03-20 16:06:13

+0

你可以在你调用的函数中直接放置铸造的'(String)respone.get(“foo”)'... – LaGrandMere 2013-03-20 16:07:12

+0

一个很好的问题,但已经回答了很多次,例如重复:http:// stackoverflow。 com/a/3894215/1081849 – sbk 2013-03-20 16:08:23

回答

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; 
    } 
    ... 
} 
+2

哇。第一次看到切换块!每天学习东西! – 2013-03-20 16:08:16

4

name已经存在,因为箱子在概念上是在同一个块中。案例:实质上是一个标签switch声明只是跳转到适当的标签。请参阅here for more info on labels in Java(不限于switch声明)。

要想看到这个,想象一下如果你没有break语句。您可以在case条款中初始化name,并进入下一个条款。如果这是一个问题,请将每个案例子句放在单独的{}区块中。

0

因为即使它们互相排斥,它们也存在于相同的Switch块中。因此,可以在单独的块中写入每个case子句,以避免该错误。

0

记住case是不是你的范围,该块{ .. }

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; 
    } 
0

:你可以在自己的块包裹每一种情况下。

无论您在哪里声明其第一个开关块或第二个开关块。如果你首先声明它,那么它可以通过切换后访问。

如果你想要有相同的变量名,那么你可以通过加上大括号或块来做到这一点,因为那个变量作用域仍然在块中。

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: 
     ... 
}