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


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

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)

我究竟做错了什么?


3864
2017-07-01 18:27


起源

来自groovy的菜鸟:我有同样的例外,但出于不同的原因。我定义了一个比我想在代码开头使用的方法更晚的方法。当我更换它时,它工作。 - CsBalazsHungary


答案:


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

如果要指定要在其上进行的操作 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!!!!')

12
2017-07-01 18:37



非常感谢,这是我第一次使用常规,我需要帮助,快速提问我是否使用下面的代码我会传递4个参数吧? 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, 'Visa', 'Passport!!!!') - geretd
是。 copyAndReplaceText() 是方法名称,您传递四个参数:1st source,第二 dest,3 'Visa' 和第四 'Passport!!!!' - Will
我希望你喜欢groovy。我觉得与之合作很愉快:-) - Will
老实说,我从来没有听说过星期五之前的常规,我不得不自己研究,现在我坚持这个要求。搜索并替换名为xxxx~的临时文件,旧文本用新文本不知道怎么做 - geretd
但是,我发现groovy非常好,它不像java那么严格,即使它有它的基础。 - geretd


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

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


1
2018-06-04 09:02





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


0
2017-08-22 13:19





帮助其他猎人。我有这个错误,因为该功能不存在。

我有拼写错误。


0
2017-09-21 19:31