我最近将我的项目从Java 1.7升级到Java 1.8。
我得到一个异常不一致的堆栈映射方法在我的一个类。
在方法中初始化一些未赋值的局部变量解决了这个问题,但是谁能解释一下为什么在Java 8中使用未读变量会引发异常,谢谢。
它很可能是日食版本(开普勒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();
}
stackFrame:
由:java.lang.VerifyError:不一致的堆栈映射帧在分支目标2079
Exception Details:someeclass . setdata (someeclass/Data)I @2079: iload_3
原因:不能赋值给'java/lang/StringBuffer'(栈映射,locals[4])
当前帧:bci: @98标志:{}locals: {'someClass/setData', 'someClass/Data', 'someClass/Data', integer, top, top}栈:{'someClass/Data'}
Stackmap框架:bci: @2079标志:{}locals: {'someClass/setData', 'someClass/Data', 'someClass/Data',整数,'java/lang/StringBuffer', 'java/lang/String'}{}字节码:0x0000000: 2bb6 032b 4d03 3e06 bd01 3e59 0313 032f
假设您使用的是OpenJDK -很可能您遇到了编译器错误JDK-8160699。解决办法是升级到较新的JDK版本。