Java字节码错误:必须在堆栈上找到对象/数组

bxjv4tth  于 2022-11-07  发布在  Java
关注(0)|答案(1)|浏览(103)

我正在将一个简单的语言编译成JVM字节码,并且在Java对象方法调用方面遇到了一些问题。
java.lang.VerifyError: (class: Test_1, method: main signature: ()V) Expecting to find object/array on stack
下面是由IntelliJ从我的字节码生成的Java源代码

import java.util.ArrayList;

public final class Test_1 {
    public static void main() {
        ArrayList var1 = new ArrayList();
        var1.add(19);
        int var2 = (Integer)var1.get(0);
    }
}

这正是我要做的。创建一个ArrayList,赋值并从中阅读数据。上面的代码看起来像是一个有效的Java代码。
下面是我的字节码

{
  public static void main();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=0
  0: new           #9  // class java/util/ArrayList
  3: dup
  4: invokespecial #12  // Method java/util/ArrayList."<init>":()V
  7: astore_1
  8: aload_1
  9: bipush        19
  11: invokestatic  #16  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
  14: invokevirtual #26  // Method java/util/ArrayList.add:(Ljava/lang/Object;)Z
  17: pop
  18: aload_1
  19: astore_0
  20: aload_0
  21: iconst_0
  22: invokevirtual #34  // Method java/util/ArrayList.get:(I)Z
  25: checkcast     #2   // class java/lang/Integer
  28: invokevirtual #11  // Method java/lang/Integer.intValue:()I
  31: istore_1
  32: return
}

我怀疑18-20行有什么奇怪的地方,但我不确定。其余的字节码指令对我来说似乎没什么问题。
为什么验证器会抱怨在堆栈上找不到对象?

iezvtpos

iezvtpos1#

22处ArrayList.get方法的签名错误。
正确的值为(I)Ljava/lang/Object;

相关问题