美文网首页Bugs
java.lang.VerifyError 原理及常见错误

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

作者: 木猫尾巴 | 来源:发表于2016-11-11 13:42 被阅读6253次

    [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代码修改继承或者申请寄存器操作错误

    相关文章

      网友评论

        本文标题:java.lang.VerifyError 原理及常见错误

        本文链接:https://www.haomeiwen.com/subject/kkrfpttx.html