我正在将一个简单的语言编译成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行有什么奇怪的地方,但我不确定。其余的字节码指令对我来说似乎没什么问题。
为什么验证器会抱怨在堆栈上找不到对象?
1条答案
按热度按时间iezvtpos1#
22处
ArrayList.get
方法的签名错误。正确的值为
(I)Ljava/lang/Object;