3

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

6 回答 6

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;
    }
    ...
}
于 2013-03-20T16:06:39.490 回答
4

name已经存在,因为这些案例在概念上位于同一块中。case: 本质上是一个标签switch语句只是跳转到适当的标签。有关Java 中标签的更多信息,请参见此处(不限于switch语句)。

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

于 2013-03-20T16:05:58.947 回答
0

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

于 2013-03-20T16:06:26.077 回答
0

请记住,这case不是您的范围,这些块是{ .. }

于 2013-03-20T16:06:42.077 回答
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;
  }
于 2013-03-20T16:06:56.357 回答
0

如果您在 switch 中声明的变量没有大括号,那么它的作用域会在整个 switch 中保持不变。

Its no matter where you declare its first switch block or second. If you declare it first then its can be access after it through out switch.

If you want to have same variable name then you can do it by putting in braces or block because then that variable scope remain within the block.

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:
        ...
}
于 2013-03-20T16:07:39.920 回答