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
相关产品推荐
相关产品推荐

