首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么java.lang.VerifyError会阻止成功的编译?

为什么java.lang.VerifyError会阻止成功的编译?
EN

Stack Overflow用户
提问于 2014-09-28 12:23:52
回答 4查看 1.9K关注 0票数 1

根据这个主题:获得java.lang.VerifyError的原因

如果执行jvm的版本比用于编译的jvm更新,java.lang.VerifyError将获得该版本。

我们总是可以使用以下jvm选项解决这个问题:-XX:-UseSplitVerifier

根据这一规定:

https://stackoverflow.com/a/16467026/2674303

使用这个选项是“完全安全的”。

因此,我不明白为什么java.lang.VerifyError是阻碍成功编译的问题。请澄清。也许对图书馆来说哪种仪器的字节码不安全?

EN

回答 4

Stack Overflow用户

发布于 2014-09-28 13:35:44

您所链接的Q&A指的是一种特定类型的验证错误,使用另一种验证器可以安全地处理这些错误。但是,还有其他类型的验证错误,您不应该忽略.你不能用这种方式来处理。

简言之,有关问题中的意见一般不适用。一般而言:

  • 切换到替代验证器可能不会有帮助。
  • 如果完全禁用验证器,则可能会运行可能违反JVM运行时类型安全(等等)约束的代码。这可能导致安全问题和/或堆损坏和硬JVM崩溃。

如果您有需要建议的特定VerifyError,请包含完整的异常消息和堆栈跟踪,并描述其发生的情况。请注意,Andrey的回答是正确的,验证错误的一个常见原因是代码中的bug,它正在为各种目的执行“字节码工程”。通常,修复方法是更改为相应依赖项的不同版本。

票数 5
EN

Stack Overflow用户

发布于 2014-09-28 12:48:57

当您的字节代码在某种程度上不正确时,就会发生VerifyError。例如,当它试图从未初始化的变量中读取或将一个基元值赋给Object类型的字段时。工具库可能存在导致生成这种格式错误的字节码的错误。如果您能够分享错误的确切细节,我们可能会更具体地了解错误的确切原因。

票数 2
EN

Stack Overflow用户

发布于 2014-09-28 13:31:12

其目标是强制工具和库在操作Java字节码时生成正确的StackMapTable属性,这样JVM就不必执行缓慢而复杂的type inferencing验证阶段,而是只执行快速和简单的type checking阶段。

在Java8中,-XX:-UseSplitVerifier已经被废弃了,它不会有任何帮助了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26084822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档