web-dev-qa-db-fra.com

comment réparer groovy.lang.MissingMethodException: Pas de signature de la méthode:

J'essaie d'utiliser cette méthode sans fermeture 

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!!!!')
}

mais quand je le lance, j'obtiens l'erreur suivante:

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)

Qu'est-ce que je fais mal?

17
geretd

Parce que vous passez trois arguments à une méthode à quatre arguments. En outre, vous n'utilisez pas la fermeture passée.

Si vous souhaitez spécifier les opérations à effectuer par-dessus le contenu de source, utilisez une fermeture. Ce serait quelque chose comme ça:

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

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

Si vous voulez toujours échanger des chaînes, transmettez les deux, comme l'indique déjà la signature de votre méthode:

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

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

Pour aider d'autres chasseurs de bogues. J'ai eu cette erreur parce que la fonction n'existait pas. 

J'ai eu une faute d'orthographe.

2
Glycerine

C'est peut-être aussi parce que vous avez peut-être donné classname avec toutes les lettres en minuscule quelque chose que groovy (connaître la version 2.5.0) ne supporte pas.

nom de classe - L'utilisateur est accepté mais l'utilisateur ne l'est pas.

1
Bhuvnesh Incedo

Vous pouvez également obtenir cette erreur si les objets que vous transmettez à la méthode sont en panne. En d'autres termes, dites que votre méthode prend, dans l'ordre, une chaîne, un entier et une date. Si vous passez une date, puis une chaîne, puis un entier, vous obtiendrez le même message d'erreur.

0
Sulteric