Java 无法从空堆栈中弹出操作数

Java 无法从空堆栈中弹出操作数,java,java-bytecode-asm,bytecode-manipulation,Java,Java Bytecode Asm,Bytecode Manipulation,使用ASM4。我正在从另一种语言动态生成字节码。它生成了以下内容,但我不清楚发生了什么。我的猜测是try/catch块正在干扰堆栈。前两行加载一个Lambda2,它需要在堆栈的最末端成为最深的项,但我不明白是什么让它在过程中消失 在指令13处,堆栈似乎消失了。这就是它进入try/catch块的地方。堆栈进入try/catch块时是否会被抛出?如果是的话,这就可以解释问题了 java.lang.RuntimeException: Error at instruction 43: Cannot po

使用ASM4。我正在从另一种语言动态生成字节码。它生成了以下内容,但我不清楚发生了什么。我的猜测是try/catch块正在干扰堆栈。前两行加载一个Lambda2,它需要在堆栈的最末端成为最深的项,但我不明白是什么让它在过程中消失

在指令13处,堆栈似乎消失了。这就是它进入try/catch块的地方。堆栈进入try/catch块时是否会被抛出?如果是的话,这就可以解释问题了

java.lang.RuntimeException: Error at instruction 43: Cannot pop operand off an empty stack. apply()Ljava/lang/Object;
00000 R . .  :  :    L0
00001 R . .  :  :     LINENUMBER 1 L0
00002 R . .  :  :     LDC "foo"
00003 R . .  : R  :     INVOKESTATIC com/stralos/asm/ASMUtil.getUserFunc (Ljava/lang/Object;)Ljava/lang/Object;
00004 R . .  : R  :    L1
00005 R . .  : R  :     LINENUMBER 1 L1
00006 R . .  : R  :     CHECKCAST com/stralos/lang/Lambda2
00007 R . .  : R  :    L2
00008 R . .  : R  :     LINENUMBER 1 L2
00009 R . .  : R  :     LDC 1
00010 R . .  : R J  :     INVOKESTATIC java/lang/Long.valueOf (J)Ljava/lang/Long;
00011 R . .  : R R  :    L3
00012 R . .  : R R  :     LINENUMBER 1 L3
00013 ?        :     LDC 1
00014 ?        :     INVOKESTATIC java/lang/Long.valueOf (J)Ljava/lang/Long;
00015 ?        :    L4
00016 ?        :     LINENUMBER 1 L4
00017 ?        :     ASTORE 1
00018 ?        :    L5
00019 ?        :     GOTO L6
00020 R . .  : R  :    L7
00021 R . .  : R  :     LINENUMBER 1 L7
00022 R . .  : R  :    FRAME SAME1 java/lang/Throwable
00023 R . .  : R  :     ASTORE 2
00024 R . R  :  :    L8
00025 R . R  :  :     LINENUMBER 1 L8
00026 R . R  :  :     NEW shen/lambda/ToRun$1
00027 R . R  : R  :     DUP
00028 R . R  : R R  :    L9
00029 R . R  : R R  :     LINENUMBER 1 L9
00030 R . R  : R R  :     INVOKESPECIAL shen/lambda/ToRun$1.<init> ()V
00031 R . R  : R  :    L10
00032 R . R  : R  :     LINENUMBER 1 L10
00033 R . R  : R  :     CHECKCAST com/stralos/lang/Lambda1
00034 R . R  : R  :     ALOAD 2
00035 R . R  : R R  :     INVOKEVIRTUAL com/stralos/lang/Lambda1.apply (Ljava/lang/Object;)Ljava/lang/Object;
00036 R . R  : R  :     ASTORE 1
00037 R R R  :  :    L6
00038 R R R  :  :     LINENUMBER 1 L6
00039 R R R  :  :    FRAME FULL [shen/eval/ToEvaluate$0 java/lang/Object] [com/stralos/lang/Lambda2 java/lang/Long]
00040 R R R  :  :     ALOAD 1
00041 R R R  : R  :    L11
00042 R R R  : R  :     LINENUMBER 1 L11
00043 R R R  : R  :     INVOKEVIRTUAL com/stralos/lang/Lambda2.apply (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
00044 ?        :     ARETURN
00045 ?        :    L12
     TRYCATCHBLOCK L3 L5 L7 java/lang/Throwable
java.lang.RuntimeException:指令43处出错:无法从空堆栈中弹出操作数。apply()Ljava/lang/Object;
00000R.::L0
00001 R.::1号线L0
00002 R.::最不发达国家“富”
00003 R.:R:INVOKESTATIC com/stralos/asm/ASMUtil.getUserFunc(Ljava/lang/Object;)Ljava/lang/Object;
00004 R.:R:L1
00005 R.:R:线路号1 L1
00006 R.:R:CHECKCAST com/stralos/lang/Lambda2
00007 R.:R:L2
00008 R.:R:1号线L2
00009 R.:R:最不发达国家1
00010 R.:rj:invokestaticjava/lang/Long.valueOf(J)Ljava/lang/Long;
00011 R.:R:L3
00012 R.:右:线路号1 L3
00013 ?        :     最不发达国家1
00014 ?        :     INVOKESTATIC java/lang/Long.valueOf(J)Ljava/lang/Long;
00015 ?        :    L4
00016 ?        :     线路号1 L4
00017 ?        :     阿斯托尔1号
00018 ?        :    L5
00019 ?        :     转到L6
00020 R.:R:L7
00021 R.:R:1号线L7
00022 R.:R:FRAME SAME1 java/lang/Throwable
00023 R.:R:ASTORE 2
00024 R。R::L8
00025 R。R::线路号1 L8
00026 R。R::新申/lambda/ToRun$1
00027 R。R:R:DUP
00028 R。R:R:L9
00029 R。R:R:1号线L9
00030R。R:R:INVOKESPECIAL shen/lambda/ToRun$1。()V
00031 R。R:R:L10
00032 R。R:R:LINENUMBER 1 L10
00033 R。R:R:CHECKCAST com/stralos/lang/Lambda1
00034R。R:R:ALOAD 2
00035R。R:rr:invokevirtualcom/stralos/lang/Lambda1.apply(Ljava/lang/Object;)Ljava/lang/Object;
00036 R。R:R:ASTORE 1
00037 R::L6
00038 R::行号1 L6
00039 R::全帧[shen/eval/ToEvaluate$0 java/lang/Object][com/stralos/lang/Lambda2 java/lang/Long]
00040 R::ALOAD 1
00041 R:R:L11
00042 R:R:行号1 L11
00043 R:R:INVOKEVIRTUAL com/stralos/lang/Lambda2.apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
00044 ?        :     轮回
00045 ?        :    L12
TRYCATCHBLOCK L3 L5 L7 java/lang/Throwable

是输入catch()块时堆栈为空。由于catch处理程序无法知道try{}块内发生异常的指令,因此堆栈可能处于try{}块的任何可能状态

此外,在进入catch()块时,不能假定try{}块内修改的任何局部变量处于任何特定状态,但在您的情况下这不是问题


因此,当退出catch块时,需要确保堆栈处于与未引发异常相同的状态。在这种情况下,您需要在代码到达L6时使用Lambda2对象和Long对象填充堆栈。

invokevirtual
操作数堆栈上是否没有任何参数?你希望怎么做?是的,我理解。我的问题是操作数要去哪里?堆栈上应该有正确的推送次数才能使其正常工作。例如,为什么它们会在13时消失?
L10
变成了
L6
:-)