当我按下面的错误读取时,我正在写一个groovy代码:
Exception in thread "main" groovy.lang.MissingMethodException: No signature of method: java.lang.Boolean.getAt() is applicable for argument types: (java.lang.Integer) values: [0]
Possible solutions: getAt(java.lang.String), putAt(java.lang.String, java.lang.Object), wait(), grep(), getClass(), wait(long)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:55)
at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:46)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at myPackage.myClass.myMethod_closure3_closure5.doCall(line:xyz)
:
:
所以你可以在最后一行看到,我的方法有两个嵌套的闭包。行号xyz正在执行以下操作:
(rvar1,rvar2) = methodThatReturnsMultipleValues(param1,param2)
我调试了代码,发现methodThatReturnsMultipleValues()
返回[false,false]
,如下所示:
methodThatReturnsMultipleValues(def param1,def param2)
{
//...
return [false,false]
}
然而,当我在调试行号时走出方法时,xyz给出了上述异常。根据groovy,这应该将rvar1
和rvar2
分配给false
。我试图在像这样的较小代码上复制异常:
class TempClass
{
static main(def args)
{
boolean bvar1 = false
boolean bvar2 = false
(bvar1, bvar2) = returnMultipleValues()
println bvar1
println bvar2
}
static private returnMultipleValues()
{
boolean a = false
boolean b = false
return [a, b]
}
}
然而,不幸的是,上面的代码工作正常并正确地打印false
两次。所以无法在小代码上复制问题。令人惊讶的是,当我将xyz行改为:
def a = methodThatReturnsMultipleValues(param1,param2)
a
会被true
分配,并以所需的方式继续,因为我正在测试不会使用rvar1
和rvar2
的情况。只有当我将xyz行改回
(rvar1,rvar2) = methodThatReturnsMultipleValues(param1,param2)
错误会再次出现,但在使用rvar1
和rvar2
的情况下会失败。
我只是迷失方向,我应该在哪里寻找。尤其是java.lang.Boolean.getAt()
并没有让我有多大意义。
main()
调用。所以让我知道我是否应该付出额外的努力才能真正让它从main()
调用,并尽可能在尽可能小的代码上复制问题。但在此之前,我真的很感激任何盲目的猜测来解决这个问题。