引起:java.lang.NumberFormatException:无效的double:" [" 5.0"," 5.0"]"

时间:2016-07-12 12:53:08

标签: java android sdk

我正在将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());
    }
}
}

任何帮助都将受到高度赞赏

1 个答案:

答案 0 :(得分:0)

似乎你进入了你的json双打阵列?我是对的吗?

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

请检查你的json是否正确,并且数组是否为双精度数组而不是一个double值。