Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带字符串的Switch语句_Java_Switch Statement_Java 7 - Fatal编程技术网

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";