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

JDK17下Switch语句传入泛型返回值触发java.lang.VerifyError异常

Eclipse 2021-09搭配JDK17使用switch传入泛型返回值触发java.lang.VerifyError问题

我在Eclipse 2021-09上使用JDK17时遇到了java.lang.VerifyError报错,报错信息本身参考价值不高。经排查定位到问题根源为switch语句传入了从Map或其他泛型类型中取出的值,如果先将该值赋值给本地变量再传入switch语句,一切运行正常。

测试代码

import java.util.HashMap;
import java.util.Map;

public class SwitchFail {
  public static void main(String[] args) {
    // 运行失败
    Map<Integer, String> stringMap = new HashMap<>();
    stringMap.put(1, "Test");
    switch(stringMap.get(1)) {
    }

    // 运行正常
    String plainString = "Test";
     switch(plainString) {
    }
  }
}

运行报错信息

Error: Unable to initialize main class SwitchFail
Caused by: java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    SwitchFail.main([Ljava/lang/String;)V @33: invokevirtual
  Reason:
    Type 'java/lang/Object' (current frame, stack[0]) is not assignable to 'java/lang/String'
  Current Frame:
    bci: @33
    flags: { }
    locals: { '[Ljava/lang/String;', 'java/util/HashMap', 'java/lang/Object' }
    stack: { 'java/lang/Object' }
  Bytecode:
    0000000: bb00 1059 b700 124c 2b04 b800 1312 19b9
    0000010: 001b 0300 572b 04b8 0013 b900 2102 0059
    0000020: 4db6 0025 57b1  

我暂未测试JDK11到17之间的其他版本,switch在这些版本之间新增了不少功能,有可能是该变动导致的问题。也有可能是Eclipse JDT或者我本地JDK的问题,欢迎大家在其他配置或IDE上尝试复现该错误。我本地测试环境为macOS下的OpenJDK(build 17+35-2724)。

问题更新

如下代码也会触发相同问题:

List<String> stringList = Arrays.asList("Test");
switch(stringList.get(0)) {}

该问题大概率是适配Java 17的新版JDT或者我本地安装环境的问题。


内容的提问来源于stack exchange,提问作者Zhedar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:45:02