我最近将我的项目从 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();
}
堆栈帧:
原因: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