Java switch-case使用->箭头语法报错expected ':'如何修复
问题根因
你代码里case 常量 -> { ... }的写法是Java 14正式落地的新版Switch语法(出自JEP 361),如果当前项目使用的JDK版本低于14,或者编译配置的源码兼容版本低于14,编译器就会按照传统Switch语法规则解析代码,在->位置抛出"期望':'"的错误。
注意:该箭头语法不属于lambda表达式,只是写法和lambda的箭头标记相似,是专门为Switch设计的语法糖,不会引入函数式接口相关的额外开销。
修复方案
要保留箭头写法不需要修改你现有case内的业务逻辑,只需要调整编译环境配置即可。不存在不升级JDK版本还能保留该箭头写法的方案,低版本JDK的语法规则中没有定义->在case标签后的语义,无法通过第三方依赖等方式扩展支持。
- 将项目使用的JDK版本升级到14及以上,优先选择17、21这类长期支持(LTS)版本,稳定性更好。
- 对齐构建工具的编译版本配置:
如果是Maven项目,调整maven-compiler-plugin的源码、目标版本配置,示例如下:
如果是Gradle项目,在build.gradle中添加如下配置:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>17</source> <target>17</target> </configuration> </plugin>sourceCompatibility = '17' targetCompatibility = '17' - 如果使用IntelliJ IDEA、Eclipse这类IDE开发,需要同步将项目的语言级别(Language Level)设置为和JDK版本一致,避免IDE内置语法检查误报。
修复后可正常运行的代码
配置完成后,你原有的代码不需要修改逻辑即可正常编译运行,代码如下:
switch (exp.getOperator()) { case "+" -> { lastVar = "%add" + addCounter++; lastVarType = "Int"; operation = "add"; } case "-" -> { lastVar = "%sub" + subCounter++; lastVarType = "Int"; operation = "sub"; } case "*" -> { lastVar = "%mul" + mulCounter++; lastVarType = "Int"; operation = "mul"; } case "/" -> { lastVar = "%div" + divCounter++; lastVarType = "Int"; operation = "div"; } }
补充说明:Java 12、13版本也支持该箭头语法,但属于预览特性,需要手动添加编译参数
--enable-preview开启,不建议在生产环境使用预览特性,直接升级到14及以上正式版本即可。
内容的提问来源于stack exchange,提问作者Andrey Smith
相关产品推荐
相关产品推荐

