4

我最近将我的项目从 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();
      }  

堆栈帧:

原因:java.lang.VerifyError:分支目标 2079 处的堆栈图帧不一致

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

原因:类型 top(当前帧,locals[4])不可分配给 'java/lang/StringBuffer'(堆栈映射,locals[4])

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

Stackmap Frame: bci: @2079 flags: { } 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

4

1 回答 1

0

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

于 2018-08-14T09:14:46.773 回答