2015-10-29 9 views
6

Rano wszystkie - widzę, że podobne pytania były zadawane kilka razy, ale wszystkie wydają się być dla skompilowanych projektów lub tych związanych z Gradle. W każdym razie, ja dostaję błądGroovy niejednoznaczna metoda przeciążenia

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] 

kiedy uruchomić ten skrypt

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

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

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

która sama wywołuje to

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() 

nie mogę się zorientować, co problem jest tutaj . O ile widzę wszystkie metody są wykonane prawidłowo i nie ma dwuznaczności. Czy ktokolwiek może wskazać, dokąd zmierzam?

+0

jak BigDecimal ma kilka konstruktorów Zakładam, że nie mogę rozstrzygnąć, który z nich podjąć, dlatego błąd –

Odpowiedz

6

niejednoznaczne jest wywołanie metody konstruktora BigDecimal za:

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

Dalej mówi, że jednym z możliwych przeciążeń jest konstruktor BigDecimal(String val). Nie jestem pewien, co dokładnie odnosi się do [class [C], ale przypuszczam, że odnosi się do BigDecimal(BigInteger val).

Linia, która jest przyczyną prawdopodobnie jest to ten:

new java.math.BigDecimal (settlement) 

ponieważ zmienna rozliczenie jest null. W podobnych sytuacjach można po prostu ustawić parametr tak:

new java.math.BigDecimal (settlement as String) 

, ale najprawdopodobniej spowoduje to wyrzucenie NullPointerException później. Dlatego upewnij się, że nie przekazujesz wartości null do konstruktora BigDecimal.

+0

Dzięki, że dostałem to. Jak słusznie sugerujesz, wywołuje to wyjątek NullPointerException, ale jest to łatwe do uporządkowania. – Horsebrass

0

Jako wyjątek mówi settlement jest null tak Groovy nie wie, który konstruktor BigInteger zadzwonić (za nieważną może być albo).

To jest nieważna z powodu:

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

więc jeśli json lub source_amount są null, wówczas multiplier jest zerowy, więc zwróci null ...

Można też zatrzymać metoda powrocie zerowy. .. Albo zmienić konstruktora:

return transfer.amount * new BigDecimal((String)settlement) 
Powiązane problemy