Java switch为何支持方法调用表达式,却对其他表达式报非语句错误
问题核心原因
你遇到的报错本质和switch语法无关,是Java基础语法规则的限制:不是所有表达式都可以独立作为语句使用。
你现在编写的属于「语句型switch」,case -> 右侧必须接合法的Java语句。而Java语法中,仅以下几类表达式允许独立作为语句使用:
- 方法调用表达式(无论方法是否有返回值,比如你写的
dog()就属于这类) - 赋值表达式(比如
a = 10、b += 5) - 自增/自减表达式(比如
i++、--j) - 对象创建表达式(比如
new ArrayList<>())
剩下的算术运算表达式(比如2 + 2)、字面量表达式(比如true、100、"test")、比较运算表达式等,都不允许单独作为语句存在——因为这类表达式的计算结果没有被接收、也没有产生任何副作用,写了没有实际意义,Java语法直接禁止这种写法。
对应你代码里的三个case:
case MONDAY -> dog();:方法调用符合表达式语句要求,编译正常case TUESDAY -> 2 + 2;:算术表达式不符合要求,抛"not a statement"错误case WEDNESDAY -> true;:布尔字面量表达式不符合要求,同样报错
如果你是想用switch表达式返回值,需要把整个switch作为表达式处理,比如赋值给变量或者直接return,示例如下:
public static boolean isTimeToParty(Day day) { // 此时为表达式型switch,每个case右侧接需要返回的表达式即可 return switch (day) { case MONDAY -> dog() == 2; case TUESDAY -> 2 + 2 == 4; case WEDNESDAY -> true; default -> { System.out.println(""); yield false; } }; }
这种场景下每个case右侧只需要是匹配返回类型的表达式即可,不需要满足语句要求。
内容的提问来源于stack exchange,提问作者Unearthly
相关产品推荐
相关产品推荐

