You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的源码、目标版本配置,示例如下:
    <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>
    
    如果是Gradle项目,在build.gradle中添加如下配置:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:09:26