4

在以下代码中:

private static void example() {
    String inputString = "test";
    switch (inputString) {
        case "test":
            String outputString = "The string said test";
        case "not test":
            String outputString = "The string did not say test";
    }
    /*Do stuff with ouputString*/        
}

Eclipse 突出显示Case "not test"错误之后的行Duplicate local variable outputString。但是,由于它们位于switch语句的不同分支中,因此它们实际上并不冲突,因为一次只能生效一个。

显然,在这种情况下,我可以通过将outputString声明移到语句之外来解决这个问题switch。但是,在更复杂的程序中,解决方案可能不会那么简单。

这仅仅是 Eclipse 抛出的一个错误,以防止糟糕的编程技术,还是一个实际的 Java 错误?

我对 Java 很陌生,所以如果这是一个新手问题,我深表歉意 - 我有一个“重复局部变量 Java”的谷歌,但到目前为止,所有出现的都是人们寻求解决问题的帮助(通常解决方案是重命名变量之一),而不是讨论问题本身。

4

2 回答 2

5

在java中的switch语句的每种情况下,变量的范围是整个switch语句。

您可以通过添加大括号来创建更多嵌套范围,如下所示:

 switch (inputString) {
        case "test": {
            String outputString = "The string said test";
            break;
        }
        case "not test": {
            String outputString = "The string did not say test";
            break;
        }
    }
于 2012-11-18T16:25:46.493 回答
4

您假设每个case标签创建一个单独的范围 - 他们没有。这里的作用域是 switch 块,所以你确实在一个作用域内声明了 2 个同名的变量。

您可以为每个案例标签引入一个新范围,例如

switch (inputString) {
    case "test": {
        String outputString = "The string said test";
        break;
    }
    case "not test": {
        String outputString = "The string did not say test";
        break;
   }
}

或者,如果您的开关已经很大,也许您应该为每种情况制定一个方法,以包装您在那里所做的所有工作

于 2012-11-18T16:27:09.767 回答