Bugs

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

2016-11-11  本文已影响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个

上一篇 下一篇

猜你喜欢

热点阅读