java.lang.VerifyError 原理及常见错误

[TOC]

原理

Java虚拟机编译的时候,"校验器"检测到一个类文件虽然格式正确,但包含着一些内部不一致性或安全性问题时,抛出该错误

校验器会检查这个类的构造是否符合jvm的字节码规范,不同虚拟机可能在检查的时候有不同的方式,报告的错误也许都不一样

现在编译过程中的错误

可能原因表

异常名称 异常栈中的段落信息 可能原因
java.lang.VerifyError Call to wrong initialization method 可能是在调用构造函数即的时候传进了错误的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 在你调用 方法的时候使用了非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代码修改继承或者申请寄存器操作错误

你可能感兴趣的:(java.lang.VerifyError 原理及常见错误)