java.lang.NegativeArraySizeException at org.springframework.asm.frame.merge(frame.java:1222) at org.springframework.asm.MethodWriter.computeAllframes(MethodWriter.java:1610) at org.springframework.asm.MethodWriter.visitMaxs(MethodWriter.java:1546) at com.nailsoul.spring.core.asm.proxy.asm.util.CodeUtils.endMethod(CodeUtils.java:273)
如发生在 if场景 IFGT之前没有往栈内压入int类型数据
CodeUtils.condition(mv,IFGT,()->{
mv.visitVarInsn(ALOAD,2);
mv.visitInsn(POP);
});
修复代码
mv.visitIntInsn(BIPUSH,3);
CodeUtils.condition(mv,IFGT,()->{
mv.visitVarInsn(ALOAD,2);
mv.visitInsn(POP);
});
ArrayIndexOutOfBoundsException
数字不一定是0
java.lang.ArrayIndexOutOfBoundsException: 0 at org.springframework.asm.frame.merge(frame.java:1268) at org.springframework.asm.frame.merge(frame.java:1244) at org.springframework.asm.MethodWriter.computeAllframes(MethodWriter.java:1610) at org.springframework.asm.MethodWriter.visitMaxs(MethodWriter.java:1546) at com.nailsoul.spring.core.asm.proxy.asm.util.CodeUtils.endMethod(CodeUtils.java:273)
通过asm动态添加方法时 时不时报数组越界错误 经过分析
分为生成的代码运行是逻辑异常 和 语法异常
- 逻辑异常
空数组访问下标为0的元素肯定报错
根据异常打印的调用链可以区分 - 语法异常
把变量压入栈内 没处理到致的 如以下获取数组指定下标元素 通常visitMaxs引起的mv.visitVarInsn(ALOAD,2); mv.visitVarInsn(ILOAD,4); mv.visitInsn(AALOAD);
对应的代码
var2[var4];
后续没有处理 肯定得标红
修复
mv.visitVarInsn(ALOAD,2); mv.visitVarInsn(ILOAD,4); mv.visitInsn(AALOAD); // 只要把该元素消费调就行 如pop mv.visitVarInsn(ASTORE,5);
有时相同代码明明在这A处不报错 移到B处就报错了 如
没有被if等快包裹时 没问题
mv.visitLdcInsn(11); mv.visitVarInsn(ILOAD,4);
被if包裹 就报错了
CodeUtils.condition(mv,IFGT,()->{
mv.visitLdcInsn(11);
mv.visitVarInsn(ILOAD,4);
});
修复代码
CodeUtils.condition(mv,IFGT,()->{
mv.visitLdcInsn(11);
mv.visitVarInsn(ILOAD,4);
mv.visitInsn(POP2);
});



