gpt4 book ai didi

java - 错误消息 "Attempt to split long or double on the stack"表示什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:57:24 25 4
gpt4 key购买 nike

我的代码出现以下错误:

Attempt to split long or double on the stack

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

[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)

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

public class DashboardViewModel implements Serializable {

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

/**
* Collection representing all the services
*/
private Map<Long, ServiceCustomerModel> serviceDataMap;

在特定的 JSP 页面上,我正在执行以下操作。

for (Long serviceId : dashboardViewModel.getServices()) {
Service service = dashboardViewModel.getService(serviceId);
}

上述目标类中的getServices方法如下。

public Set<Long> getServices() {
return this.serviceDataMap.keySet();
}

在jsp中包含上述代码时。我确实得到了错误。否则,它会起作用。

进一步调查:

我已使用以下代码片段更新了 dashboard.jsp 文件。我无法确定原因,但此代码有效。

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

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

最佳答案

Java 虚拟机对涉及 long 和 double 数据类型的操作执行额外的验证,对于 very simple reason that

A value of type long or type double occupies two consecutive local variables. Such a value may only be addressed using the lesser index. For example, a value of type double stored in the local variable array at index n actually occupies the local variables with indices n and n +1; however, the local variable at index n +1 cannot be loaded from. It can be stored into. However, doing so invalidates the contents of local variable n.

当验证者确定错误的指令用于访问长整型或 double 变量时(例如,一条指令试图将索引 n 处的局部变量视为整数或 float ,从而将 double /长整型变量分开变量),然后标记所述错误。

在这种情况下,除了修复生成此字节码的字节码生成器之外,没有什么可以做的。这可能是 Java 编译器本身,或任何字节码操作框架,如 ASM、cglib 或 Javassist。

编辑:

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

关于java - 错误消息 "Attempt to split long or double on the stack"表示什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6098239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com