我尝试了以下代码:
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
我的问题是,为什么在第一种情况下会发生补偿错误。我该如何解决呢。
答案 0 :(得分:6)
"Str1"
是一个编译时常量,这就是为什么case "Str"
没问题。
然而,从First_String
的定义我们可以看出它不是常数,因为它可以随时改变它的值。
您可以尝试将其设为final
:
public static final String First_String = "Str1";
答案 1 :(得分:4)
constant expression与静态成员不同。即使是静态成员也可以通过代码进行更改...需要final
为considered 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'。