Grails:NameRegistry.getIdFor中导致ArrayIndexOutOfBoundsException的原因是什么?

时间:2012-07-05 12:18:59

标签: java spring grails groovy

我在Grails 2.0.4应用程序中获得以下stacktrace:

java.lang.ArrayIndexOutOfBoundsException: 6170
        at com.springsource.loaded.NameRegistry.getIdFor(NameRegistry.java:44)
        at com.springsource.loaded.NameRegistry.getIdOrAllocateFor(NameRegistry.java:59)
        at com.springsource.loaded.TypeRegistry.getTypeIdFor(TypeRegistry.java:756)
        at com.springsource.loaded.MethodInvokerRewriter$RewriteClassAdaptor$RewritingMethodAdapter.rewritePUTSTATIC(MethodInvokerRewriter.java:789)
        at com.springsource.loaded.MethodInvokerRewriter$RewriteClassAdaptor$RewritingMethodAdapter.visitFieldInsn(MethodInvokerRewriter.java:708)
        at sl.org.objectweb.asm.ClassReader.accept(Unknown Source)
        at sl.org.objectweb.asm.ClassReader.accept(Unknown Source)
        at com.springsource.loaded.MethodInvokerRewriter.rewrite(MethodInvokerRewriter.java:280)
        at com.springsource.loaded.MethodInvokerRewriter.rewrite(MethodInvokerRewriter.java:83)
        at com.springsource.loaded.TypeRegistry.methodCallRewrite(TypeRegistry.java:767)
        at com.springsource.loaded.agent.ModifyDefineInClassLoaderForClassArtifactsType.modify(ModifyDefineInClassLoaderForClassArtifactsType.java:77)
        at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.define(ClassLoaderForClassArtifacts.java)
        at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts$1.run(ClassLoaderForClassArtifacts.java:86)
        at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts$1.run(ClassLoaderForClassArtifacts.java:84)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.defineClassAndGetConstructor(ClassLoaderForClassArtifacts.java:84)
        at org.codehaus.groovy.runtime.callsite.CallSiteGenerator.compilePogoMethod(CallSiteGenerator.java:217)
        at org.codehaus.groovy.reflection.CachedMethod.createPogoMetaMethodSite(CachedMethod.java:228)
        at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createCachedMethodSite(PogoMetaMethodSite.java:207)
        at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.createPogoMetaMethodSite(PogoMetaMethodSite.java:183)
        at groovy.lang.MetaClassImpl.createPogoCallCurrentSite(MetaClassImpl.java:3022)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallCurrentSite(CallSiteArray.java:95)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
        < actual call site in my code, some method call to the same service the original method is in>

显然我的google-Fu已经失去了我,或者之前没有人遇到过这个问题。甚至不只是搜索com.springsource.loaded.NameRegistry会产生任何结果。

在尝试相同的操作几次之后,问题通常会消失,但这不是解决方案。 关于我能找到的任何提示?

我猜测Spring是代理我试图调用的方法,并且无论如何都无法在自己的注册表中查找它。这怎么可能是我的错?

编辑: Stacktrace中导致此问题的第一行是一个无害的方法调用,就像调用方法foo中的bar一样:

class FooService {
      def foo(bla, bloerk) {
          1
      }

      def bar() {
          foo(1,2)
      }
}

2 个答案:

答案 0 :(得分:2)

实际上,在使用GPars进行批量更新时,我看到了很多。 我通过将失败的条目添加到后执行的重试池中解决了这个问题 批次已经完成。但是我对解决方案并不满意。但由于该功能并不是非常重要,并且每隔一小时左右运行一次,它只会给很少更新的对象带来轻微的更新故障。

我从未在生产模式中看到这种情况,只是在开发模式下,所以我认为它与某种方式的classLoader的动态重新加载能力有关。 在批处理运行开始的时候,我经常会看到这种类型的错误,当JVM热情好转的时候。 我将深入研究这个问题。如果我找到更有用的东西,我会回复。

我想回复你的帖子告诉你,你并不孤单。

我在Mac OSX上运行: java版“1.6.0_33” Java(TM)SE运行时环境(版本1.6.0_33-b03-424-11M3720) Java HotSpot(TM)64位服务器VM(版本20.8-b03-424,混合模式)

我已经通过Grails 2看到了这个问题 - &gt; 2.1,不要以为我在1.3.5-> 1.3.7

中看到了它

答案 1 :(得分:0)

要么您正在尝试读取/存储否定数字,要么存储/读取&gt; array.size()。