Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 错误消息是什么;尝试在堆栈上拆分“长”或“双”;指示?_Java_Verifyerror - Fatal编程技术网

Java 错误消息是什么;尝试在堆栈上拆分“长”或“双”;指示?

Java 错误消息是什么;尝试在堆栈上拆分“长”或“双”;指示?,java,verifyerror,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/ht

我的代码中出现以下错误:

尝试在堆栈上拆分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)
问题代码: 我创建了一个模型,如下所示

public class DashboardViewModel implements Serializable {

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

/**
 * Collection representing all the services
 */
private Map<Long, ServiceCustomerModel> serviceDataMap;
上述目标类中的
getServices
方法如下所示

public Set<Long> getServices() {
    return this.serviceDataMap.keySet();
}
publicsetgetservices(){
返回此.serviceDataMap.keySet();
}
在jsp中包含上述代码时。我确实得到了错误。否则,它会起作用

进一步调查:

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

ArrayList<Long> test = new ArrayList<Long>();
test.addAll(dashboardViewModel.getServices());
for (long serviceId : test) {
    Service service = dashboardViewModel.getService(serviceId);
}
ArrayList test=new ArrayList();
test.addAll(dashboardViewModel.getServices());
用于(长服务ID:测试){
服务服务=dashboardViewModel.getService(serviceId);
}

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

这可能是java.lang.VerifyError的一条消息,当“验证器”检测到一个类文件(尽管格式良好)包含某种内部不一致或安全问题时,会抛出该消息

JVM规范说明(4.4.5):

所有8字节常量在类文件的
constant\u pool
表中占据两个条目。如果
CONSTANT\u Long\u info
CONSTANT\u Double\u info
结构是
CONSTANT\u pool
表中索引n处的项,则池中下一个可用项位于索引
n+2
处。
constant\u pool
索引
n+1
必须有效,但被视为不可用

所以,实际上猜测一下,类文件上有一个常量池,它打破了这个规则。普通java编译器不会(不应该)出现这种情况,但有更多的方法来创建和更改类文件(AOP、BCEL、模糊处理或其他编程语言)。尝试获取stacktrace,它应该向有问题的类文件提供提示

进一步阅读


这似乎是一个验证错误,表明正在加载的字节码不正确 与您的vm/编译器完全兼容。它很可能来自外部库 您使用的,或者它可能是在构建过程中生成的,并指示一个bug

您是否(直接或间接)使用任何生成的字节码?它经常与AOP一起使用


谷歌也为这个错误提供了很多点击率。阅读它们,看看有没有合适的地方。

我可以想出一个涉及自动装箱的案例:您是否试图使用自动装箱来存储浮点数?如果这些结果自动装箱到Double中,那么当您将它们从堆栈中拉回来时(可能是由于JVM错误),因为float占用的字节少于Double的字节数,所以字节大小检查失败,并引发此错误。openjdk查看(某些)源代码时似乎就是这样——我猜Sun(对不起,Oracle!)JDK也是如此

long或double类型的值 占据两个连续的本地 变量。这样的值可能只有 使用较小的索引进行处理。对于 例如,存储类型为double的值 在索引n处的局部变量数组中 实际上占据了局部变量 指数n和n+1;但是, 索引n+1处的局部变量不能为空 从…加载。它可以存储到存储库中。 但是,这样做会使 局部变量n的内容

当验证器确定使用不正确的指令访问长变量或双变量时(例如,试图将索引n处的局部变量视为整数或浮点的指令,该指令拆分双变量/长变量),则标记所述错误

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

编辑:


在查看stacktrace之后,所讨论的类似乎恰好是一个生成的servlet(来自dashboard.jsp)。值得检查的是,JDK的升级(包括编译翻译后的JSP)是否能解决问题。

是否可以通过更改代码来解决问题:

for (long serviceId : test) {
    Service service = dashboardViewModel.getService(serviceId);
}
进入:


我以前从未见过这种情况。您使用的是什么版本的JVM?我们使用的是java 1.6 java版本“1.6.0_11”java(TM)SE运行时环境(build 1.6.0_11-b03)java HotSpot(TM)客户端VM(build 11.0-b16,混合模式,共享)是否可以发布导致此问题的代码片段?此错误是否以异常或错误类为前缀。。比如java.lang.VerifyError?你能发布生成这个的代码吗?看起来错误在JVM本身。
for (long serviceId : test) {
    Service service = dashboardViewModel.getService(serviceId);
}
for (Long serviceId : test) {
    Service service = dashboardViewModel.getService(serviceId);
}