在switch case中重新实例化变量

时间:2013-03-20 16:04:14

标签: java switch-statement

为什么我不能在每个具有相同名称的情况下创建变量。例如,从下面的代码中,在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:
        ...
}

6 个答案:

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