带字符串的 Switch 语句
Switch statement with 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");
}
而我的 Constants
class 是,
public class Constants {
public static String First_String = "Str1";
public static String Second_String = "Str2";
public static String Third_String = "Str3";
}
我得到一个编译错误,
Exception in thread "main" java.lang.Error: Unresolved compilation problems: case expressions must be constant expressions
但是当我尝试使用以下代码时,
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"
是一个编译时常量,这就是为什么 case "Str"
没问题。
但是,从First_String
的定义我们可以看出它不是一个常量,因为它可以随时改变它的值。
你可以尝试设置为final
:
public static final String First_String = "Str1";
一个constant expression is not the same as a static member. Even a static member can be changed by code... It needs to be final
to be considered a constant expression:
来自the JLS:
A compile-time constant expression is an expression...
- Simple names (§6.5.6.1) that refer to constant variables (§4.12.4).
所以
case "Something":
可以。原样
public static final String ME = "Other";
...
case ME:
最后,enum
也可以用在 switch
-case
语句中。
干杯,
你的 Constants
class 中的字符串必须声明 final
才能被视为常量。
如果它们被声明为 final
,编译器知道它们永远不会改变,因此可以将它们视为常量表达式。如果它们没有被声明final
,在程序执行期间它们可能被重新分配给不同的字符串,所以它们不是常量。
改变
public static String First_String = "Str1";
到
public static final String First_String = "Str1";
现在它是一个常数。
您必须将 Constants
声明为 final
public static final String First_String = "Str1";
public static final String Second_String = "Str2";
public static final String Third_String = "Str3";
或在if-else
语句中转换switch
:
在 Eclipse 中
您可以使用以下方法将 switch
语句快速转换为 if-else
语句:
将光标移动到 switch
关键字并按 Ctrl + 1 然后 select
Convert 'switch' to 'if-else'.
我尝试了以下代码:
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
class 是,
public class Constants {
public static String First_String = "Str1";
public static String Second_String = "Str2";
public static String Third_String = "Str3";
}
我得到一个编译错误,
Exception in thread "main" java.lang.Error: Unresolved compilation problems: case expressions must be constant expressions
但是当我尝试使用以下代码时,
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"
是一个编译时常量,这就是为什么 case "Str"
没问题。
但是,从First_String
的定义我们可以看出它不是一个常量,因为它可以随时改变它的值。
你可以尝试设置为final
:
public static final String First_String = "Str1";
一个constant expression is not the same as a static member. Even a static member can be changed by code... It needs to be final
to be considered a constant expression:
来自the JLS:
A compile-time constant expression is an expression...
- Simple names (§6.5.6.1) that refer to constant variables (§4.12.4).
所以
case "Something":
可以。原样
public static final String ME = "Other";
...
case ME:
最后,enum
也可以用在 switch
-case
语句中。
干杯,
你的 Constants
class 中的字符串必须声明 final
才能被视为常量。
如果它们被声明为 final
,编译器知道它们永远不会改变,因此可以将它们视为常量表达式。如果它们没有被声明final
,在程序执行期间它们可能被重新分配给不同的字符串,所以它们不是常量。
改变
public static String First_String = "Str1";
到
public static final String First_String = "Str1";
现在它是一个常数。
您必须将 Constants
声明为 final
public static final String First_String = "Str1";
public static final String Second_String = "Str2";
public static final String Third_String = "Str3";
或在if-else
语句中转换switch
:
在 Eclipse 中
您可以使用以下方法将 switch
语句快速转换为 if-else
语句:
将光标移动到 switch
关键字并按 Ctrl + 1 然后 select
Convert 'switch' to 'if-else'.