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

标签 java jvm compatibility bytecode bytecode-manipulation

根据这个主题: Reasons of getting a java.lang.VerifyError

java.lang.VerifyError 获取执行 jvm 的版本是否比用于编译的 jvm 更新。

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

据此:

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

使用此选项是“绝对安全”的。

因此我不明白为什么 java.lang.VerifyError 是阻止成功编译的问题。请澄清。也许对于检测字节码的库来说不安全?

最佳答案

您链接到的问答是指一种特定类型的验证错误,使用替代验证程序可以安全地解决该错误。但是,还有其他类型的验证错误您不应该忽略...并且您不能以这种方式处理。

简而言之,链接问题中的建议并不普遍适用。一般而言:

  • 切换到替代 validator 可能无济于事。

  • 如果您完全禁用验证程序,您将面临运行可能违反 JVM 运行时类型安全(等)约束的代码的风险。这可能会导致安全问题和/或堆损坏和 JVM 硬崩溃。


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

关于java - 为什么 java.lang.VerifyError 会阻止编译成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26084822/

相关文章:

java - 为什么,如果两个对象根据 equals 不相等,则不需要返回不同的 hashCode 值?

java - 我传递给 JVM 的选项似乎没有效果

java - 从接口(interface)中省略公共(public)抽象会损害字节码兼容性吗?

java - Eclipse Java - 将编译器设置为 Java 6 但仍然有 Java 7 方法/库并且没有提示

java swing来计算所有控件的数量

java - 何时关闭 JDBC 中的 Connection、Statement、PreparedStatement 和 ResultSet

jvm - Java 运行时多语言的用途是什么?

java - 迁移到 64 位后 JVM 崩溃

javascript - JavaScript 和 jQuery 选择器的浏览器兼容性问题

java - 我如何知道我的 JFrame 当前是否已最小化?