java - 未使用的局部变量 Java 8 - java.lang.VerifyError : Inconsistent stackmap frames

标签 java java-8 local-variables stack-frame jvm-bytecode

我最近将我的项目从 Java 1.7 升级到 Java 1.8。

我的一个类中的某个方法出现堆栈映射不一致的异常。

在方法中初始化一些未分配的局部变量解决了它,但有人可以解释为什么在 Java 8 中使用未读变量会引发异常,谢谢。

它可能与正在使用的 eclipse 版本 (Kepler SR 2 20140224-0627) 一起使用,只是好奇。

解决方法

  1. 之前在修复错误代码之前使用“--xxSplitVerifier”(在 1.7 中)或“-noVerify”Jvm 参数。

  2. 如果 eclipse 工作区中的编译器首选项未选中“保留未使用的局部变量”选项,则它可以在 java 8 中正常编译

方法:

无法发布完整的方法,因为它是我所在公司的非常大且受限制的代码。

public synchronized int setData()  //sample code 
{
    int id= 0;
    StringBuffer sb;  // works if initialized - stringBuffer sb = null;
    String  name;     // works if name = null

    if (true) {
        sb = new StringBuffer();  
      } else {
        sb = new StringBuffer();
      }  

堆栈框架:

Caused by: java.lang.VerifyError: Inconsistent stackmap frames at branch target 2079

异常详细信息:位置: someClass.setData(someClass/Data)I @2079: iload_3

原因: 类型 top (current frame, locals[4]) is not assignable to 'java/lang/StringBuffer' (stack map, locals[4])

当前帧: bci: @98 标志:{} locals: { 'someClass/setData', 'someClass/Data', 'someClass/Data', integer, top, top } 堆栈:{'someClass/Data'}

堆栈图框架: bci: @2079 标志:{} locals: { 'someClass/setData', 'someClass/Data', 'someClass/Data', integer, 'java/lang/StringBuffer', 'java/lang/String'} 堆栈:{} 字节码: 0x0000000: 2bb6 032b 4d03 3e06 bd01 3e59 0313 032f 0x0000010: 5359 0413 0331 5359 0513 0333 533a 0606

最佳答案

假设您正在使用 OpenJDK - 很可能您遇到了编译器错误 JDK-8160699 .然后解决方案是升级到更新的 JDK 版本。

关于java - 未使用的局部变量 Java 8 - java.lang.VerifyError : Inconsistent stackmap frames,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40534048/

相关文章:

java - 如何将 ActionListener 添加到模态 JDialog?

Java8 Lambda 和异常

Python3.6 : Trying to avoid using a global for my swap function with tkinter

python - 使用 `exec` 调用时如何更新局部变量?

c++ - 如何使用指针从不同的函数访问局部变量?

java - 如何只用它的键定义一个 JSONObject

java - 应该在递归函数中使用 StringBuilder 吗?

java - 无法在本地 Java 上调用 Lambda AWS

java - 使用 Comparator 的 ConcurrentSkipListSet 不会添加新的唯一值

java - 仅当另一个列表不为空时如何过滤列表