Java Bytecode Error : Expecting to find object/array on stack
Java Bytecode Error : Expecting to find object/array on stack
我正在将一种简单的语言编译成 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 行发生了一些有趣的事情,但我不确定。其余的字节码指令对我来说似乎没问题。
为什么验证者抱怨在堆栈上找不到对象?
22处的ArrayList.get
方法的签名是错误的。
正确的是(I)Ljava/lang/Object;
我正在将一种简单的语言编译成 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 行发生了一些有趣的事情,但我不确定。其余的字节码指令对我来说似乎没问题。
为什么验证者抱怨在堆栈上找不到对象?
22处的ArrayList.get
方法的签名是错误的。
正确的是(I)Ljava/lang/Object;