由以下原因引起:java.lang.NumberFormat异常:无效双精度:"[" 5.0 "," 5.0 "]"



我正在将Citrus钱包集成到我公司的应用程序中,但遇到了以下错误。

堆栈跟踪:

java.lang.RuntimeException: An error occured while executing doInBackground()
                                                                      at         android.os.AsyncTask$3.done(AsyncTask.java:304)
                                                                     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                                                                     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                                                                     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                                                                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                     at java.lang.Thread.run(Thread.java:818)
                                                                  Caused by: java.lang.NumberFormatException: Invalid double: "["5.0","5.0"]"
                                                                     at java.lang.StringToReal.invalidReal(StringToReal.java:63)
                                                                     at java.lang.StringToReal.initialParse(StringToReal.java:164)
                                                                     at java.lang.StringToReal.parseDouble(StringToReal.java:282)
                                                                     at java.lang.Double.parseDouble(Double.java:301)
                                                                     at com.citrus.sdk.classes.Amount.getValueAsDouble(Amount.java:65)
                                                                     at com.citrus.sdk.payment.PaymentBill.<init>(PaymentBill.java:90)
                                                                     at com.citrus.sdk.payment.PaymentBill.fromJSON(PaymentBill.java:261)
                                                                     at com.citrus.sdk.GetJSONBill.doInBackground(GetJSONBill.java:70)
                                                                     at com.citrus.sdk.GetJSONBill.doInBackground(GetJSONBill.java:22)
                                                                     at android.os.AsyncTask$2.call(AsyncTask.java:292)
                                                                     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                                                                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                                     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                                                     at java.lang.Thread.run(Thread.java:818) 

这是 java 代码。在对话框中单击"是"后,将发生此错误:

public class FragmentWallet extends DialogFragment implements View.OnClickListener {
private Context mContext;
private int balance = 1200;
Button proceed;
TextView textView;
TextView log;
TextView user_bal;
CitrusClient citrusClient;
Message text;
Amount amount = new Amount("5.0");
private String BILL_URL = "my_url"
private WalletFragmentListener mListener;
String msg;
public FragmentWallet() {
}
public FragmentWallet(Context mContext) {
    this.mContext = mContext;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.wallet_screen, container, false);
    textView = (TextView) rootView.findViewById(R.id.user_email);
    log = (TextView) rootView.findViewById(R.id.logout);
    user_bal=(TextView) rootView.findViewById(R.id.user_balance);
    proceed = (Button) rootView.findViewById(R.id.proceed_citrus);
    msg = PaymentDialogFragment.getCitrusClientInstance().getUserEmailId();
    proceed.setOnClickListener(this);
    log.setOnClickListener(this);
    textView.setText(msg);
    return rootView;
}
@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.proceed_citrus:
            onCreateDialog();
            break;
        case R.id.logout:
            onLogout();
            break;
    }
}
public void onCreateDialog() {
    AlertDialog.Builder builder1 = new AlertDialog.Builder(mContext);
    builder1.setMessage("Are you sure you want to proceed?");
    builder1.setCancelable(true);
    builder1.setPositiveButton(
            "Yes",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    //dialog.cancel();
                    payUsingNewCash();
                }
            });
    builder1.setNegativeButton(
            "No",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            });
    AlertDialog alert11 = builder1.create();
    alert11.show();
}
private void payUsingNewCash() {
    Log.d("inside", "payUsingNewCash");
    checkBalance();
}
private void checkBalance() {
    Log.d("inside", "payUsingNewCash");
    PaymentDialogFragment.getCitrusClientInstance().getBalance(new Callback<Amount>() {
        @Override
        public void success(Amount amount) {
            //get balance amount . for now balance is hardcoded to 1200
            double bal=(Double)amount.getValueAsDouble();
             user_bal.setText("Your current balance is Rs."+bal);
            if (bal >50) {
                Toast.makeText(mContext,"balance is "+bal, Toast.LENGTH_LONG).show();
                //proceed with payment
                proceedWithPayment();
                Log.d("inside", "payUsingNewCash");
            } else {
                LoadMoney loadMoney=new LoadMoney(mContext);
                FragmentManager fm=getFragmentManager();
                loadMoney.show(fm,null);
            }
        }
        @Override
        public void error(CitrusError error) {
            Toast.makeText(mContext,"balance is not available. Please try again",Toast.LENGTH_LONG).show();
        }
    });
}
public void proceedWithPayment() {
    // Toast.makeText(mContext,"balance is not available. Please try again",Toast.LENGTH_LONG).show();
    Log.d("TAG","inside Proceed");
    try {
        Log.d("TAG","inside try");
        PaymentDialogFragment.getCitrusClientInstance().prepaidPay(new PaymentType.CitrusCash(amount,BILL_URL),new Callback<PaymentResponse>() {

            @Override
            public void success(PaymentResponse paymentResponse) {
                Log.d("TAG","inside success");
                Toast.makeText(mContext,"Successful",Toast.LENGTH_LONG).show();
            }
            @Override
            public void error(CitrusError citrusError) {
                Log.d("TAG", citrusError.getMessage());
                Toast.makeText(mContext,"Not successful.",Toast.LENGTH_LONG).show();
            }
        });Log.d("TAG","++");
    } catch (CitrusException e) {
        Log.d("Tag",e.toString());
        e.printStackTrace();
    }
    }
public void onLogout(){
    getDialog().dismiss();
    PaymentDialogFragment.getCitrusClientInstance().signOut(new Callback<CitrusResponse>()
    {
        @Override
        public void success(CitrusResponse citrusResponse) {
            UserManagementFragment userManagementFragment = new UserManagementFragment(mContext);
            FragmentManager fm=getFragmentManager();
            userManagementFragment.show(fm,null);
        }
        @Override
        public void error(CitrusError error) {
        }
    });
}
}

方法 Amount.getValueAsDouble():

 public double getValueAsDouble() throws NumberFormatException {
    double value = 0.0D;
    if(!TextUtils.isEmpty(this.value)) {
        value = Double.parseDouble(this.value);
    }
    return value;
}

整个金额类:

public class Amount implements Parcelable {
private final String value;
private final String currency;
public static final Creator<Amount> CREATOR = new Creator() {
    public Amount createFromParcel(Parcel source) {
        return new Amount(source, null);
    }
    public Amount[] newArray(int size) {
        return new Amount[size];
    }
};
public Amount(String value) {
    this.value = value;
    this.currency = "INR";
}
public Amount(String value, String currency) {
    this.value = value;
    this.currency = currency;
}
public String getValue() {
    return !TextUtils.isEmpty(this.value)?this.value.replaceFirst("^0+(?!$)", ""):this.value;
}
public String getCurrency() {
    return this.currency;
}
public String getValueAsFormattedDouble(String format) throws NumberFormatException {
    DecimalFormat df = new DecimalFormat(format);
    return df.format(this.getValueAsDouble());
}
public double getValueAsDouble() throws NumberFormatException {
    double value = 0.0D;
    if(!TextUtils.isEmpty(this.value)) {
        value = Double.parseDouble(this.value);
    }
    return value;
}
public static Amount fromJSON(String response) {
    Amount amount = null;
    JSONObject jsonObject = null;
    if(!TextUtils.isEmpty(response)) {
        try {
            jsonObject = new JSONObject(response);
            amount = fromJSONObject(jsonObject);
        } catch (JSONException var4) {
            var4.printStackTrace();
        }
    }
    return amount;
}
public static Amount fromJSONObject(JSONObject amountObject) {
    Amount amount = null;
    if(amountObject != null) {
        String value = amountObject.optString("value");
        String currency = amountObject.optString("currency");
        if(!TextUtils.isEmpty(value) && !TextUtils.isEmpty(currency)) {
            amount = new Amount(value, currency);
        }
    }
    return amount;
}
public static String toJSON(Amount amount) {
    JSONObject billObject = toJSONObject(amount);
    return billObject != null?billObject.toString():null;
}
public static JSONObject toJSONObject(Amount amount) {
    JSONObject billObject = null;
    if(amount != null) {
        try {
            billObject = new JSONObject();
            billObject.put("value", amount.value);
            billObject.put("currency", amount.currency);
        } catch (JSONException var3) {
            var3.printStackTrace();
        }
    }
    return billObject;
}
public int describeContents() {
    return 0;
}
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(this.value);
    dest.writeString(this.currency);
}
private Amount(Parcel in) {
    this.value = in.readString();
    this.currency = in.readString();
}
public String toString() {
    return "Amount{value='" + this.value + ''' + ", currency='" + this.currency + ''' + '}';
}
public int hashCode() {
    return super.hashCode();
}
public boolean equals(Object o) {
    if(this == o) {
        return true;
    } else if(!(o instanceof Amount)) {
        return false;
    } else {
        Amount amount = (Amount)o;
        return this.getValueAsDouble() == amount.getValueAsDouble() && this.currency.equalsIgnoreCase(amount.getCurrency());
    }
}
}

任何帮助将不胜感激

似乎你进入了双打的 json 数组?我说的对吗?

`"["5.0","5.0"]"`

请检查您的 JSON 是否正确,以及数组是否解析为双精度数组而不是一个双精度值。