有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ASM计算帧错误,If+赋值

我再次遇到ASM的问题,它是COMPUTE_FRAMES。每当我使用自定义编译器编译此代码时(下面的字节码):

代码

Random random = Random()
int i = 10
Object i1 = i

if (i == 10) i1 = "a";

println "test"

字节码

public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
  stack=0, locals=0, args_size=1
     0: invokestatic  #14                 // InterfaceMethod dyvil/lang/Random.apply:()Ldyvil/lang/Random;
     3: astore_1      
     4: bipush        10
     6: istore_2      
     7: iload_2       
     8: invokestatic  #19                 // Method dyvil/lang/Int.apply:(I)Ldyvil/lang/Int;
    11: astore_3      
    12: iload_2       
    13: bipush        10
    15: if_icmpne     21
    18: ldc           #21                 // String a
    20: astore_3      
    21: ldc           #23                 // String test
    23: invokestatic  #29                 // Method dyvil/lang/Predef.println:(Ljava/lang/String;)V
    26: return        
  LocalVariableTable:
    Start  Length  Slot  Name   Signature
        0      26     3    i1   Ljava/lang/Object;
        0      26     1 random   Ldyvil/lang/Random;
        0      26     2     i   I
        0      26     0  args   [Ljava/lang/String;
MethodParameters:
  Name                           Flags
  args                           

ASM在visitMaxs(0, 0)时导致此错误:

java.lang.NullPointerException
    at org.objectweb.asm.Item.a(Unknown Source)
    at org.objectweb.asm.ClassWriter.c(Unknown Source)
    at org.objectweb.asm.ClassWriter.a(Unknown Source)
    at org.objectweb.asm.Frame.a(Unknown Source)
    at org.objectweb.asm.Frame.a(Unknown Source)
    at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source)

不幸的是,由于ASM的创建者坚持混淆它(--),我无法弄清楚这里的确切问题是什么。我尝试过删除if语句(离开赋值)并用一个简单的方法调用替换赋值,但这两种方法都没有导致任何错误,并且工作得很好。只有if+赋值的组合才可能导致此错误


共 (1) 个答案

  1. # 1 楼答案

    我的问题是ClassWriter实现中重写的getCommonSuperClass方法在这种情况下返回了null。由于ASM似乎将该方法的返回值提供给某个Item构造函数/方法,因此后一个类(可以理解)与该值进行斗争并崩溃

    检查getCommonSuperClass的返回值并在null时返回java/lang/Object修复了我的问题

    (回答这个问题,我就可以结束这个问题,*可能*面临类似问题的人知道他们需要检查他们的getCommonSuperClass