JVM字节码编译报Expecting to find object/array on stack错误如何解决
报错原因说明
你代码存在两处核心问题,其中第二点是触发本次校验错误的直接原因:
- 冗余操作:第18~20行的
aload_1->astore_0->aload_0属于无意义的冗余指令,你可以直接使用aload_1获取ArrayList对象引用,不过这部分不会触发校验报错。 - 方法签名配置错误:第22行
invokevirtual #34调用ArrayList.get时,你写的方法描述符是(I)Z,但ArrayList.get(int)的正确返回值是Object类型,对应描述符应为(I)Ljava/lang/Object;。JVM做字节码校验时会按照你写的描述符推导栈类型,认为这条指令执行后栈顶是boolean基本类型值(JVM中Z对应boolean类型),而接下来的checkcast指令要求栈顶必须是引用类型才能做类型校验,此时栈顶是基本类型,就直接抛出了Expecting to find object/array on stack的错误。
另外你第31行istore_1会覆盖之前存储ArrayList引用的局部变量槽1,属于逻辑隐患,虽然本次用不到该引用不会触发问题,但建议给int类型的返回值分配独立的局部变量槽。
内容的提问来源于stack exchange,提问作者fnisi
相关产品推荐
相关产品推荐

