case
用法规则说:
案例表达式必须评估为Compile Time Constant
。
case(t)表达式必须与switch(t)的表达式相同,其中t 是类型(String)。
如果我运行此代码:
public static void main(String[] args) {
final String s=new String("abc");
switch(s)
{
case (s):System.out.println("hi");
}
}
它将编译错误视为:"case expression must be a constant expression"
另一方面,如果我使用final String s="abc";
进行尝试,它可以正常工作。
据我所知,String s=new String("abc")
是对堆上的String
对象的引用。而s
本身就是一个编译时常量。
这是否意味着final String s=new String("abc");
不是编译时间常量?
答案 0 :(得分:2)
在Java SE 7及更高版本中,您可以在switch语句的表达式中使用String对象。
您只能在案例中使用常量表达式而不能使用变量。
使用构造函数创建String不被视为常量。
答案 1 :(得分:2)
使用此,
String s= new String("abc");
final String lm = "abc";
switch(s)
{
case lm:
case "abc": //This is more precise as per the comments
System.out.println("hi");
break;
}
基本类型或类型String的变量,即final和 用编译时常量表达式(第15.28节)初始化,是 称为常量变量
问题是您的代码final String s= new String("abc");
没有初始化常量变量。
答案 2 :(得分:1)
它不认为new String()
是常量(即使String
是不可变的)。
试试这个:
public static void main(String[] args)
{
final String s = "abc";
switch (s)
{
case (s):
System.out.println("hi");
}
}
编辑:我猜你的switch (s)
是一个拼写错误,没有多大意义。
另外,如果你在switch语句中使用常量,那么将它们作为常量字段提取可能会更加清晰,例如: private static final String s = "abc";
。如果你使用枚举而不是字符串,甚至更清楚,但我意识到这并不总是可行的。
答案 3 :(得分:0)
问题是你可以在variable S
的任何地方更改switch
的值,这样就可以执行所有cases
。所以它会给出"case expression must be a constant expression"
错误,如果变量是final
,那么它的值就不能改变。
修改强>
在case
中,您需要具有编译时常量,final
变量被视为运行时常量。由于最终变量可能会被延迟初始化而编译器无法确定。
答案 4 :(得分:0)
问题在于您尝试切换和测试案例变量s
。
哪个,正在抛出错误。 "case expression must be a constant expression"
。这与s
本身无关......但使用s
作为案例变量。理解?
以下是使用可正常工作的相同变量的示例。
private void switchTest() {
final String s = new String("abc");
switch (s) {
case "abc":
System.out.println("This works fine... woohoo.");
break;
default:
System.out.println("Do something default.");
}
}
答案 5 :(得分:-1)
如何将int或其他原始数据类型作为switch语句的编译时常量?
public class MainClass{
public static void main(String[] argv){
final int a = 1;
final int b;
b = 2;
int x = 0;
switch (x) {
case a: // ok
case b: // compiler error
}
}
}