![](/img/trans.png)
[英]Switch statement eclipse error: case expressions must be constant expressions
[英]Why Switch requires statement but accepts expressions
我正在研究 switch 表达式,我想我发现了一个奇怪的行为:
public static boolean isTimeToParty(Day day) {
switch (day) {
case MONDAY -> dog(); //expression allowed
case TUESDAY -> 2 + 2; //error: not a statement
case WEDNESDAY -> true; //error: not a statement
default -> System.out.println("");
}
return false;
}
public static int dog() {
return 2;
}
为什么我可以输入值dog()
这是一个表达式但不允许其他类型的表达式? Intellij 提示我"not a statement"
错误。
提前致谢。
IntelliJ 识别出您正在尝试使用 switch 语句而不是 switch 表达式。 如果您将代码更改为:
int val = switch (day) {
case MONDAY -> dog();
case TUESDAY -> 2 + 2;
case WEDNESDAY -> true;
default -> System.out.println("");
}
您会发现错误现在出现在 print 语句和true
值上,因为它们无法转换为int
。 这是因为 Intellij 现在将您的代码识别为 switch 表达式。
换句话说,switch 表达式的所有分支必须是相同类型的表达式,而 switch 语句的分支必须是语句。 方法 call dog()
是两者,因此它可以在任一上下文中工作。
问题是2 + 2
和true
不是 Java 语句。 在参考文档中,我们可以阅读以下内容:
语句大致相当于自然语言中的句子。 一条语句构成了一个完整的执行单元。 通过以分号 (;) 终止表达式,可以将以下类型的表达式组成语句。
- 赋值表达式
- 任何使用 ++ 或 --
- 方法调用
- 对象创建表达式
这样的语句称为表达式语句。 以下是表达式语句的一些示例:
//赋值语句
aValue = 8933.234;// 增量语句
一个值++;// 方法调用语句
System.out.println("世界你好!");// 对象创建语句
自行车 myBike = new Bicycle();
2 + 2
和true
都不是,因为它们是表达式,因此 switch 语句中的编译错误。
开关位于语句上下文中。 语句也可能是方法调用,丢弃其结果。 还存在 switch 表达式,其中的要求是相反的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.