我最近将我的项目从 Java 1.7 升级到 Java 1.8。
我的一个类中的某个方法出现堆栈映射不一致的异常。
在方法中初始化一些未分配的局部变量解决了它,但有人可以解释为什么在 Java 8 中使用未读变量会引发异常,谢谢。
它可能与正在使用的 eclipse 版本 (Kepler SR 2 20140224-0627) 一起使用,只是好奇。
解决方法
之前在修复错误代码之前使用“--xxSplitVerifier”(在 1.7 中)或“-noVerify”Jvm 参数。
如果 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/