[TOC]
原理
Java虚拟机编译的时候,"校验器"检测到一个类文件虽然格式正确,但包含着一些内部不一致性或安全性问题时,抛出该错误
校验器会检查这个类的构造是否符合jvm的字节码规范,不同虚拟机可能在检查的时候有不同的方式,报告的错误也许都不一样
现在编译过程中的错误
可能原因表
异常名称 | 异常栈中的段落信息 | 可能原因 |
---|---|---|
java.lang.VerifyError | Call to wrong initialization method | 可能是在调用构造函数即<init> 的时候传进了错误的owner |
java.lang.VerifyError | Incompatible object argument for function call | 同样是方法调用的时候出现的错误。看时候有参数设置错误了 |
java.lang.VerifyError | Stack size too large | 设置的最大栈空间大小不够 |
java.lang.VerifyError | Illegal local variable number | 可能是设置的最大局部变量大小不够,也可能是访问的局部变量的index不对 |
java.lang.VerifyError | Must call initializers using invokespecial | 在你调用 <init> 方法的时候使用了非INVOKESPECIAL的其他操纵码了。 |
java.lang.VerifyError | Expecting to find integer on stack | 可能是在赋值的时候类型不匹配,典型的就是将int类型直接赋值到Integer这之类的。固然在写java代码的时候可以直接赋值,但是在字节码的时候先要调用Integer的valueOf方法创建一个Integer对象再赋值 |
java.lang.ClassFormatError | Arguments can't fit into locals in class file | 可能是设置的最大局部变量大小不够 |
Android 虚拟机注意
ART 模式下面,可能不会报告错误
但是在 Davlik 虚拟机下,会在运行时编译,检测器就会工作
导致在5.0及其以上的设备工作正常,但在操作系统5.0以下(部分4.4开启了ART不会出现)以下报告
java.lang.VerifyError` 错误
导致这个错误的原因有2个
- 三方jar包本身有错误
- 反编译smali代码修改继承或者申请寄存器操作错误
网友评论