如何修复groovy.lang.MissingMethodException:没有方法的签名:

时间:2013-07-01 18:28:00

标签: groovy

我试图在没有闭包的情况下使用此方法

def copyAndReplaceText(source, dest, targetText, replaceText){
    dest.write(source.text.replaceAll(targetText, replaceText))
}

def source = new File('C:/geretd/resumebak.txt') //Hello World
def dest = new File('C:/geretd/resume.txt') //blank

copyAndReplaceText(source, dest){
    it.replaceAll('Visa', 'Passport!!!!')
}

但是当我运行它时,我收到以下错误:

groovy.lang.MissingMethodException: No signature of method: ConsoleScript3.copyAndReplaceText() is applicable for argument types: (java.io.File, java.io.File, ConsoleScript3$_run_closure1) values: [C:\geretd\resumebak.txt, C:\geretd\resume.txt, ...]
Possible solutions: copyAndReplaceText(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)

at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:55)

at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:78)

at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)

at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)

at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:149)

我做错了什么?

6 个答案:

答案 0 :(得分:15)

因为您将三个参数传递给四个参数方法。此外,您没有使用传递的闭包。

如果要指定在source内容之上进行的操作,请使用闭包。它会是这样的:

def copyAndReplaceText(source, dest, closure){
    dest.write(closure( source.text ))
}

// And you can keep your usage as:
copyAndReplaceText(source, dest){
    it.replaceAll('Visa', 'Passport!!!!')
}

如果您将始终交换字符串,请传递两者,因为您的方法签名已经声明:

def copyAndReplaceText(source, dest, targetText, replaceText){
    dest.write(source.text.replaceAll(targetText, replaceText))
}

copyAndReplaceText(source, dest, 'Visa', 'Passport!!!!')

答案 1 :(得分:3)

帮助其他Bug猎手。我有此错误,因为该功能不存在。

我有一个拼写错误。

答案 2 :(得分:2)

就我而言,我只是拥有一个与函数相同的变量。

示例:

def cleanCache = functionReturningABoolean()

if( cleanCache ){
    echo "Clean cache option is true, do not uninstall previous features / urls"
    uninstallCmd = ""
    
    // and we call the cleanCache method
    cleanCache(userId, serverName)
}
...

然后在我的代码中我具有以下功能:

def cleanCache(user, server){

 //some operations to the server

}

显然,Groovy语言不支持此功能(但是其他语言(如Java)支持)。 我只是将函数重命名为executeCleanCache,它可以正常工作(或者您也可以根据自己的喜好重命名变量)。

答案 3 :(得分:1)

这也可能是因为你可能给了classname,所有字母都是小写的,而groovy(知道版本2.5.0)不支持。

类名 - 用户被接受但用户不被接受。

答案 4 :(得分:0)

如果您传递给方法的对象出现故障,也会出现此错误。换句话说,您的方法按顺序采用字符串,整数和日期。如果你传递一个日期,然后是一个字符串,那么一个整数你将得到相同的错误信息。

答案 5 :(得分:0)

就我而言,问题是我在 build.gradle 文件中注释了 firebase 依赖项,但仍在调试构建类型中使用它:

firebaseCrashlytics {
   mappingFileUploadEnabled true
}

只需对其进行评论即可使其工作。