Java 带字符串的Switch语句
我尝试了以下代码:Java 带字符串的Switch语句,java,switch-statement,java-7,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");
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");
}
我的常量
类是
public class Constants {
public static String First_String = "Str1";
public static String Second_String = "Str2";
public static String Third_String = "Str3";
}
我得到了一个编译错误
线程“main”java.lang中出现异常。错误:未解决的编译问题:大小写表达式必须是常量表达式
但当我尝试使用以下代码时
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
我的问题是,为什么在第一种情况下会出现顺从错误。“Str1”是一个编译时常量,这就是为什么大小写“Str”
是可以的
然而,从第一个字符串的定义中,我们可以看到它不是一个常数,因为它可以随时改变它的值
您可以尝试将其设置为final
:
public static final String First_String = "Str1";
A与静态成员不同。即使是静态成员也可以通过代码更改。。。它必须是最终版
才能:
发件人:
编译时常量表达式是一个表达式
- 引用常量变量(§4.12.4)的简单名称(§6.5.6.1)
所以
没关系。原样
public static final String ME = "Other";
...
case ME:
最后,enum
也可以在switch
-case
语句中使用
干杯,您的常量
类中的字符串必须声明为最终
才能视为常量
如果它们被声明为final
,编译器知道它们永远不会更改,因此可以将它们视为常量表达式。如果它们未声明为final,则在程序执行期间可能会被重新分配给不同的字符串,因此它们不是常量。更改
public static String First_String = "Str1";
到
现在它是一个常量。您必须将常量
声明为最终
public static final String First_String = "Str1";
public static final String Second_String = "Str2";
public static final String Third_String = "Str3";
或在if else
语句中转换开关
:
Eclipse中的
您可以使用以下命令将switch
语句快速转换为if-else
语句:
将光标移动到开关
关键字,按Ctrl+1,然后选择
将“开关”转换为“如果其他”
将常数设置为最终值
。所以publicstaticstringfirst\u String=“Str1”代码>首先变成公共静态最终字符串\u String=“Str1”代码>。
public static final String First_String = "Str1";
public static final String First_String = "Str1";
public static final String Second_String = "Str2";
public static final String Third_String = "Str3";