2015-10-29 7 views
6

Mattino tutto - Vedo che domande simili sono state poste un paio di volte, ma sembrano essere tutte per progetti compilati o che riguardano Gradle. Ad ogni modo, sto ottenendo l'erroreSovraccarico metodo ambiguo Groovy

Caused by: javax.script.ScriptException: groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method java.math.BigDecimal#<init>. 
Cannot resolve which method to invoke for [null] due to overlapping prototypes between: 
[class [C] 
[class java.lang.String] 

quando ho eseguito questo piccolo script

String amt = "1" 
String currency = "GBP" 
String targetCurrency = "USD" 

def settlement = crossCurrencyClient.crossCurrency(amt, currency, targetCurrency) 

return transfer.amount * new java.math.BigDecimal (settlement) 

che si attiva questo

import groovyx.net.http.HTTPBuilder 
import groovyx.net.http.RESTClient 
import groovy.json.JsonBuilder 
import groovy.json.JsonOutput 
import static groovyx.net.http.Method.GET 
import static groovyx.net.http.ContentType.JSON 

public class CrossCurrencyClient { 

    def issuingAddress = "rBycsjqxD8RVZP5zrrndiVtJwht7Z457A8" 
    String source = "rUR5QVHqFxRa8TSQawc1M6jKj7BvKzbHek" 
    String multiplier = "" 
    def resURL = "http://url-string.com/v1/" 
    def resourceIdClient = new RESTClient("${resURL}") 

    public String generateUUID() { 
     def resourceId = resourceIdClient.get(path:"uuid").data.uuid 
     println "resourceId = " + resourceId 
     return resourceId 
     } 

    public String crossCurrency(String amt,String currency,String targetCurrency) { 

     def http = new HTTPBuilder("${resURL}accounts/${source}/payments/paths/${source}/${amt}+${targetCurrency}+${issuingAddress}?source_currencies=${currency}+${issuingAddress}" 
) 

     http.request(GET,JSON) { 

      response.success = { resp, json -> 
       if(json.success){ 
        multiplier = json?.source_amount?.value 
       } 
      } 

      response.failure = { resp -> 
       println "Request failed with status ${resp.status} and message : ${resp.message}" 
       return "Something went wrong" 
      } 
     } 
    return multiplier  
    } 
} 

CrossCurrencyClient crossCurrencyClient = new CrossCurrencyClient() 

non riesco a capire cosa il problema è qui . Per quanto posso vedere tutti i metodi sono eseguiti correttamente e non c'è alcuna ambiguità. Qualcuno può indicare dove sto andando male?

+0

dato che BigDecimal ha diversi costruttori presumo di non poter risolvere quale da prendere, quindi l'errore –

risposta

6

il metodo di chiamata ambigua è costruttore di BigDecimal:

Ambiguous method overloading for method java.math.BigDecimal#<init> 

Più avanti si dice che un possibile sovraccarico è il costruttore BigDecimal(String val). Non sono sicuro di cosa si riferisca esattamente a [class [C] ma suppongo che si riferisca allo BigDecimal(BigInteger val).

La linea che è la causa è probabilmente questa:

new java.math.BigDecimal (settlement) 

perché la variabile insediamento è nullo. In situazioni simili si può solo lanciare il parametro in questo modo:

new java.math.BigDecimal (settlement as String) 

ma probabilmente gettare NullPointerException tardi. Quindi assicurati di non passare null al costruttore di BigDecimal.

+0

Grazie, l'ho capito. Come suggerisci correttamente, sta lanciando una NullPointerException, ma questo è semplice da risolvere. – Horsebrass

0

Come dice l'eccezione, settlement è null così Groovy non sa quale costruttore della BigInteger chiamare (come nulla potrebbe essere sia).

Si è nullo a causa di:

  if(json.success){ 
       multiplier = json?.source_amount?.value 
      } 

quindi se json o source_amount sono nulli, quindi multiplier è nullo, in modo da tornare nulla ...

è possibile interrompere il metodo che restituisce null. .. O cambiare il costruttore a:

return transfer.amount * new BigDecimal((String)settlement)