错误消息"尝试在堆栈上拆分长或双"表示什么?

Vij*_*bey 10 java verifyerror

我从我的代码中收到以下错误:

尝试在堆栈上拆分long或double

我对这个错误的起源一无所知,也不知道如何调试它.这表明什么问题?我该如何解决?

[ERROR]  [Mon May 23 14:29:46 IST 2011]   [(class: org/apache/jsp/dashboard_jsp, method: _jspService signature:     (Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V) Attempt to split long or double on the stack]  [10.97.34.222] hddlntdsz2350  [ session not set ] 
java.lang.VerifyError: (class: org/apache/jsp/dashboard_jsp, method: _jspService signature: (Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V) Attempt to split long or double on the stack
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
at java.lang.Class.getConstructor0(Class.java:2699)
at java.lang.Class.newInstance0(Class.java:326)
at java.lang.Class.newInstance(Class.java:308)
at org.jboss.web.tomcat.service.TomcatInjectionContainer.newInstance(TomcatInjectionContainer.java:273)
Run Code Online (Sandbox Code Playgroud)

问题代码:我创建了一个如下所示的模型

public class DashboardViewModel implements Serializable {

/** defalut serialization id */
private static final long serialVersionUID = 1L;

/**
 * Collection representing all the services
 */
private Map<Long, ServiceCustomerModel> serviceDataMap;
Run Code Online (Sandbox Code Playgroud)

}

在特定的JSP页面上,我正在做以下事情.

for (Long serviceId : dashboardViewModel.getServices()) {
           Service service = dashboardViewModel.getService(serviceId);
}
Run Code Online (Sandbox Code Playgroud)

getServices上述目标类方法如下.

public Set<Long> getServices() {
    return this.serviceDataMap.keySet();
}
Run Code Online (Sandbox Code Playgroud)

在jsp中包含上面的代码时.我确实得到了错误.否则,它的工作原理.

进一步的调查:

我已使用以下代码段更新了dashboard.jsp文件.我无法确定原因,但此代码正常运行.

ArrayList<Long> test = new ArrayList<Long>();
test.addAll(dashboardViewModel.getServices());
for (long serviceId : test) {
    Service service = dashboardViewModel.getService(serviceId);
}
Run Code Online (Sandbox Code Playgroud)

这段代码对数据有什么影响吗?

Vin*_*lds 5

Java虚拟机对涉及long和double数据类型的操作进行额外的验证,原因很简单:

long 类型或 double 类型的值占用两个连续的局部变量。这样的值只能使用较小的索引来寻址。例如,存储在索引为n的局部变量数组中的double类型的值实际上占用了索引为n和n+1的局部变量;但是,无法加载索引 n +1 处的局部变量。可以将其存储到. 然而,这样做会使局部变量 n 的内容无效。

当验证器确定使用不正确的指令来访问 long 或 double 变量时(例如,尝试将索引 n 处的局部变量视为整数或浮点的指令,这会分割 double/long 变量),然后该错误被标记。

在这种情况下,除了修复生成该字节码的字节码生成器之外,我们无能为力。这可能是 Java 编译器本身,也可能是任何字节码操作框架,如 ASM、cglib 或 Javassist。

编辑:

查看堆栈跟踪后,看来有问题的类恰好是生成的 servlet(来自仪表板.jsp)。值得检查一下涉及编译已翻译 JSP 的 JDK 升级是否可以解决该问题。