用字符串切换语句

时间:2015-05-20 10:58:57

标签: java switch-statement java-7

我尝试了以下代码:

String str = "Str1";

switch(str) {
    case Constants.First_String  : System.out.println("First String");
                                   break;
    case Constants.Second_String : System.out.println("Second String");
                                   break;
    default : System.out.println("Default String");
}

我的Constants课程是,

public class Constants {
    public static String First_String  = "Str1";
    public static String Second_String = "Str2";
    public static String Third_String  = "Str3";
}

我收到了编译错误,

  

线程“main”中的异常java.lang.Error:未解决的编译问题:case表达式必须是常量表达式

但是当我尝试使用以下代码时,

switch(str){
    case "Str1" : System.out.println("First String");
                  break;
    case "Str2" : System.out.println("Second String");
                  break;
    default : System.out.println("Default String");
}

无编译错误,并将输出打印为,

First String

我的问题是,为什么在第一种情况下会发生补偿错误。我该如何解决呢。

5 个答案:

答案 0 :(得分:6)

"Str1"是一个编译时常量,这就是为什么case "Str"没问题。

然而,从First_String的定义我们可以看出它不是常数,因为它可以随时改变它的值。

您可以尝试将其设为final

public static final String First_String  = "Str1";

答案 1 :(得分:4)

constant expression静态成员不同。即使是静态成员也可以通过代码进行更改...需要finalconsidered a constant expression

来自the JLS

  

编译时常量表达式是表达式...

     
      
  • 引用常量变量的简单名称(第6.5.6.1节)(§4.12.4)。
  •   

所以

case "Something":

没关系。按原样

public static final String ME = "Other";
...
case ME:

最后,在enum - switch语句中使用case也可以。

干杯,

答案 2 :(得分:2)

更改

public static String First_String  = "Str1";

public static final String First_String  = "Str1";

现在它是一个常数。

答案 3 :(得分:1)

必须将Constants类中的字符串声明为final才能视为常量。

如果它们被声明为final,则编译器知道它们永远不会改变,因此可以将它们视为常量表达式。如果它们未被声明为final,则存在这样的可能性,它们可能在程序执行期间被重新分配给不同的字符串,因此它们不是常量。

答案 4 :(得分:1)

您必须将Constants声明为final

public static final String First_String  = "Str1";
public static final String Second_String = "Str2";
public static final String Third_String  = "Str3";

或在switch声明中转换if-else

在Eclipse中
您可以使用以下命令快速将switch语句转换为if-else语句:

将光标移至switch关键字并按 Ctrl + 1 然后选择

  

转换'切换'到' if-else'。